gpt4 book ai didi

ruby - Rails update_all 与 hstore

转载 作者:数据小太阳 更新时间:2023-10-29 07:28:47 27 4
gpt4 key购买 nike

使用 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 添加的。对我来说仍然有点黑魔法,但希望这有助于...

关于ruby - Rails update_all 与 hstore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19259749/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com