我想在我的一些模型中添加一个非空列unique_id
。这个实现基本上是SecureRandom.hex(8)
。有没有办法在迁移本身中指定它,以便计算所有旧行的默认值。
也许是这样的:
add_column :users, :unique_id, :string, null: false, default: proc { generate_unique_id }.call
问题是,上述方法只会生成unique_id
一次(这是预期的)。有没有办法指定为每一行生成默认值?
答案 0 :(得分:2)
这不可能直接在add_column
中进行。常见的方法是:
在您的代码中,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!