做项目的时候碰到的一些问题,做一下简单的记录,备忘
1. 如何在model里使用一些routes helper methods
例如:posts_path
参考
1
2
3
4
5
6
Rails.application.routes.url_helpers.posts_path
# 同理,rails项目里面其他的一些约定俗成的东西 如 secrets settings也类似
Rails.application.secrets
Rails.application.settings
Rails.cache
2. 获取Record的dirty data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 假设我们有如下Record
class User < ApplicationRecord
# 拥有name gender birthday这些属性
has_many :used_names
end
class UsedName < ApplicationRecord
# 拥有name user_id 这些记录
belongs_to :user
end
# 我们想要做一个关于用户曾用名的记录
# 需要我们在修改用户信息提交记录时判断User.name记录是否有变更
# 则可以通过给User添加如下方法达成
# Rails5.2之前版本行为不一样,需要留意
after_update_commit :add_used_name, if: -> { saved_change_to_name? }
def add_used_name
return unless saved_change_to_name[0].present?
self.used_names << UsedName.new(user: self, name: saved_change_to_name[0])
end
3. 重构过程中删除model
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 如果最近几个的migration都不需要了
bundle exec rake db:rollback [STEP=<rollback_quality>]
rails destroy model <model_name>
# 如果是中间的一些migration版本号则
# 可以创建一个drop table的migration
# 且执行destroy model删除
class DropModel < ActiveRecord::Migration[5.1]
def change
# 因为destroy model 指令会将create_table的migration以及spec等测试删除
# 为避免重头开始执行db:setup db:migrate 时抛出table不存在的错误,需要添加 if_exists: true设置
drop_table :<table_name>, if_exists: true
end
end
rails destroy model <model_name>
4. 单独执行某个migration
开发过程中我们想重新执行某个migration则
1
2
3
4
5
6
# 假设我们有migration
class MigrationClass < ActiveRecord::Migration[5.1]
def up
add_column :products, :price, :decimal
end
end
1
2
3
4
5
6
# 先进入rails console
$ rails c
# 执行对应的migration方法
>> require './db/migrate/<migration_file_name>'
>> MigrationClass.new.up