簡體   English   中英

使用hstore Rails update_all

[英]Rails update_all with hstore

使用activerecord使用hstore列更新多個記錄的好方法是什么? 現在我正在循環,更新和保存如下:

time = Time.now.to_s
scoped_tasks.each do |task|
  task.data[:last_checked] = time
  task.save!
end

有沒有辦法用update_all查詢執行此操作? 我見過的一個解決方案看起來像這樣:

MyModel.update_all(:properties => ActiveRecord::Coders::Hstore.dump({'a' => 1}))

但問題是它會覆蓋整個列,因此會丟失其他值。 我也看到了這個:

MyModel.update_all("data = data || hstore('a', 'blah')")

但由於某種原因,我得到了0的價值。 它看起來只有在hstore為空時才有效。

我自己也在努力解決同樣的問題,這是我能夠解決的問題:

MyModel.update_all([%(data = data || hstore(?,?)), 'a', 'new_value']))

對此的核心修復是將update_all操作包裝在[]和%()中。 我仍在努力弄清楚%()如何定義Postgre SQL中的SET,所以如果有人有一個非常有幫助的解釋。

在我的情況下,我實際上也刪除了一個鍵(我真的想更新鍵名但保留值)。 因此,如果有人遇到該問題,代碼如下:

MyModel.update_all([%(data = delete("data",?)), 'a'])

我希望在同一個調用中執行這兩個操作,但這是在SQL中創建一個非常奇怪的命令,其中第二個操作作為WHERE子句的一部分而不是SET添加。 對我來說仍然有點黑魔法,但希望這有助於......

如果你使用

MyModel.update_all(:properties => ActiveRecord::Coders::Hstore.dump({'a' => 1}))

然后它將清除其他值,如果你嘗試使用

MyModel.update_all("data = data || hstore('a', 'blah')")只有在hstore列中有任何值時才會起作用,所以盡量使用兩者的組合

if (hstore_column_name).present? MyModel.update_all("data = data || hstore('a', 'blah')") else MyModel.update_all(:properties => ActiveRecord::Coders::Hstore.dump({'a' => 1}))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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