lob*_*ati 4 ruby activerecord ruby-on-rails-3 rails-postgresql hstore
使用activerecord使用hstore列更新多个记录的好方法是什么?现在我正在循环,更新和保存如下:
time = Time.now.to_s
scoped_tasks.each do |task|
task.data[:last_checked] = time
task.save!
end
Run Code Online (Sandbox Code Playgroud)
有没有办法用update_all查询做到这一点?我见过的一个解决方案看起来像这样:
MyModel.update_all(:properties => ActiveRecord::Coders::Hstore.dump({'a' => 1}))
Run Code Online (Sandbox Code Playgroud)
但问题是它会覆盖整个列,因此会丢失其他值.我也看到了这个:
MyModel.update_all("data = data || hstore('a', 'blah')")
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,我回到0了价值.它看起来只有在hstore为空时才有效.
小智 6
我自己也在努力解决同样的问题,这是我能够解决的问题:
MyModel.update_all([%(data = data || hstore(?,?)), 'a', 'new_value']))
Run Code Online (Sandbox Code Playgroud)
对此的核心修复是将update_all操作包装在[]和%()中.我仍在努力弄清楚%()如何定义Postgre SQL中的SET,所以如果有人有一个非常有帮助的解释.
在我的情况下,我实际上也删除了一个键(我真的想更新键名但保留值).因此,如果有人遇到该问题,代码如下:
MyModel.update_all([%(data = delete("data",?)), 'a'])
Run Code Online (Sandbox Code Playgroud)
我希望在同一个调用中执行这两个操作,但这是在SQL中创建一个非常奇怪的命令,其中第二个操作作为WHERE子句的一部分而不是SET添加.对我来说仍然有点黑魔法,但希望这有助于......
| 归档时间: |
|
| 查看次数: |
1143 次 |
| 最近记录: |