如果我通过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。为什么会有这个以及有哪些替代解决方案呢?
这就是它的工作原理。更改列默认值时,您将为新记录配置默认值,而不是现有记录。如果你想更新现有的值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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。