开发者社区> 问答> 正文

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

如果我通过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。为什么会有这个以及有哪些替代解决方案呢?

展开
收起
小六码奴 2019-04-10 13:50:49 2659 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

    2019-07-17 23:33:07
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
开源广进-用Service Catalog构造K8S服务能力 立即下载
《用管控策略设定多账号组织全局访问边界》 立即下载
Phoenix 全局索引原理与实践 立即下载