Rails笔记

dark
LiinNs

做项目的时候碰到的一些问题,做一下简单的记录,备忘
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