【问题标题】: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!
    

    【讨论】:

    • 嗯..好的。有道理。
    猜你喜欢
    • 1970-01-01
    • 2016-10-06
    • 2016-11-16
    • 1970-01-01
    • 2019-05-16
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多