[英]Backfill default values to a column through migration
我有一張桌子(用戶)。 在其中一個列(配置)中,我通過遷移添加了一個默認值(“A”=>0)。 現在我創建的所有新用戶都有默認值 A 但老用戶沒有。 我想為使用遷移的舊用戶回填 A 的默認值。 我怎么做?
給出:
t.jsonb "configs", default: {"B"=>7, "C"=>10, "D"=>10}
這是我現有的專欄。 這里B、C和D對於不同的User有不同的值。 我想把它變成
t.jsonb "configs", default: {"B"=>7, "C"=>10, "D"=>10, "A"=>0}
其中 B、C 和 D 的值對所有用戶保持不變,但僅將默認值“A”添加到列中的現有 json。
rails - 4.2.11 db - postgres
我已經閱讀了一些文檔,但找不到全面的答案。 任何幫助表示贊賞。
從您的評論來看,您似乎想要更新 JSONB 列以具有一組新的默認值,並且任何現有的 json 哈希都會將新的鍵/值對"A": 0
添加到當前值。 遷移可以更改數據庫,但您需要以編程方式執行此操作以更新已經具有值的行,尤其是因為它們的值並不完全相同。 話雖如此,它可能是這樣的:
User.all.each do |u|
u.configs["A"] = 0
u.save
end
這將遍歷所有用戶並將“a”的值設置為零。 如果 hash 中不存在“a”,它將添加零值,而不會觸及 JSON 中的任何其他內容。如果用戶已經存在“a”,它將被設置為零。 因此,如果您的用戶“a”的值已經從默認值零更改,您可以通過以下方式避免它們:
User.all.each do |u|
unless conifigs["A"] # if "A" already exists skip this
u.configs["A"] = 0
u.save
end
end
有關如何在 Rails 中利用 JSONB 的信息,請閱讀https://nandovieira.com/using-postgresql-and-jsonb-with-ruby-on-rails 。 如果您放入代碼以真正充分利用它,那么它是一個非常強大的工具。 請務必閱讀有關store_accessor
的部分,它會幫助您使用該 JSONB 列做更多的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.