在迁移中从 lambda 指定默认值

Specifying default value from lambda in a migration

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

也许是这样的:

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

问题是,上面的方法只会生成一次unique_id(这是意料之中的)。有没有办法指定为每一行生成默认值?

这在 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!