在迁移中指定lambda的默认值

时间:2016-12-13 11:08:06

标签: ruby ruby-on-rails-4 activerecord rails-migrations ruby-on-rails-4.2

我想在我的一些模型中添加一个非空列unique_id。这个实现基本上是SecureRandom.hex(8)。有没有办法在迁移本身中指定它,以便计算所有行的默认值。

也许是这样的:

add_column :users, :unique_id, :string, null: false, default: proc { generate_unique_id }.call

问题是,上述方法只会生成unique_id一次(这是预期的)。有没有办法指定为每一行生成默认值?

1 个答案:

答案 0 :(得分:2)

这不可能直接在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!