加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读