【问题标题】:Specifying default value from lambda in a migration在迁移中从 lambda 指定默认值
【发布时间】:2017-04-28 10:11:21
【问题描述】:
我想为我的一些模型添加一个非空列unique_id。对此的实现基本上是SecureRandom.hex(8)。有没有办法在迁移本身中指定这一点,以便计算所有 older 行的默认值。
可能是这样的:
add_column :users, :unique_id, :string, null: false, default: proc { generate_unique_id }.call
问题是,上述方法只会生成一次unique_id(这是意料之中的)。有没有办法指定为每一行生成默认值?
【问题讨论】:
标签:
ruby
ruby-on-rails-4
activerecord
rails-migrations
ruby-on-rails-4.2
【解决方案1】:
这在add_column 中是不可能的。常见的方法是:
- 创建一个可为空的列;
- 用生成的 uid 填充它;
- 更新列定义。
在您的代码中,proc { generate_unique_id }.call 没有多大意义,因为它绝对等同于 generate_unique_id。
add_column :users, :unique_id, :string, null: true
# it’s still a plain ruby code!
User.find_each do |u|
# or better use built-in SQL functoin to do this in batch
# inside your db, instead of performing a dozillion of updates
u.update_column(:unique_id, generate_unique_id)
end
change_column :users, :unique_id, :string, null: false # NOW!