开发者社区> 问答> 正文

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

宋淑婷 2019-04-10 13:50:49 181

如果我通过ActiveRecord Migration向现有列添加默认值,则在将更改部署到生产时,现有关联不会受到影响。

我可以转到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控制台查询并返回falseis_deleted时,预期的结果将是关联,而不是返回nil。为什么会有这个以及有哪些替代解决方案呢?

分享到
取消 提交回答
全部回答(1)
  • 宋淑婷
    2019-07-17 23:33:07

    这就是它的工作原理。更改列默认值时,您将为新记录配置默认值,而不是现有记录。如果你想更新现有的值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

    0 0

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题