在迁移中从 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!
我想向我的某些模型添加一个非空列 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!