为什么为ActiveRecord Migration中的现有列设置默认值不会扩展到生产中的现有关联?

时间:2019-04-07 20:59:44

标签: ruby-on-rails ruby activerecord rails-activerecord

如果我通过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的关联。为什么会这样,还有哪些替代解决方案?

1 个答案:

答案 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