ruby – 使用hstore执行Rails update_all
发布时间:2020-12-17 03:06:02 所属栏目:百科 来源:网络整理
导读:使用activerecord使用hstore列更新多个记录的好方法是什么?现在我正在循环,更新和保存如下: time = Time.now.to_sscoped_tasks.each do |task| task.data[:last_checked] = time task.save!end 有没有办法用update_all查询执行此操作?我见过的一个解决方
使用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添加.对我来说仍然有点黑魔法,但希望这有助于…… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |