如果我通过ActiveRecord迁移将默认值添加到现有列,则在将更改部署到生产中时,现有关联不会受到影响。
我可以放到Rails生产控制台上并遍历每条记录,然后将新列的值设置为false,但是这很繁琐且无法很好地扩展。
class AddDefaultValuesToAFewColumns < ActiveRecord::Migration[5.2]
def change
change_column :downloads, :is_deleted, :boolean, :default => false
end
end
create_table "downloads", force: :cascade do |t|
t.string "version"
t.string "comment"
t.string "contributors"
t.string "release_date"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "download_url"
t.boolean "is_deleted", default: false
end
从rails控制台查询时,预期结果将是为is_deleted返回false
而不是返回nil
的关联。为什么会这样,还有哪些替代解决方案?
答案 0 :(得分:1)
这就是它的工作方式。当您更改列的默认值时,您正在为新记录而不是现有记录配置默认值。如果您想使用false
更新现有值,请在Download.where(is_deleted: nil).update_all(is_deleted: false)
行之后执行change_column
之类的操作:
class AddDefaultValuesToAFewColumns < ActiveRecord::Migration[5.2]
def change
change_column :downloads, :is_deleted, :boolean, :default => false
Download.where(is_deleted: nil).update_all(is_deleted: false)
end
end