簡體   English   中英

通過遷移將默認值回填到列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM