Ben*_*Cbr 8 ruby activerecord ruby-on-rails
我有一个用例,我想使用ActiveRecord :: Relation update_all方法并指定几个要设置的字段.我使用update_all,因为可以更新很多条目,我不想加载它们并逐个更新它们.
其中一些需要直接的SQL SET语句,例如因为我根据另一列的值设置了一列.
是否有一个简单的语法与update_all使这个可读,沿着这个=>的行
MyModel.where(state: :foo).update_all([
'timespent = timespent + 500', # Can't be anything else than a SQL statement
state: :bar, # Regular Rails SQL interpolation
updated_at: DateTime.current
])
Run Code Online (Sandbox Code Playgroud)
需要注意的是上面的语法不工作,因为它会尝试寻找占位符和替换值,因此state: :bar和updated_at: DateTime.current被忽略.
对此的部分解决方案是将所有内容转换为单个SQL语句字符串,如下所示,但我不太喜欢这个,因为我需要弄清楚SQL语句,并且在使用Rails进行编码时有点过于复杂;):
MyModel.where(state: :foo).update_all([
"timespent = timespent + 500", # Can't be anything else than a SQL statement
"state = 'bar'",
"updated_at = NOW()" # Needed to translate from Rails to PGSQL
].join(', '))
Run Code Online (Sandbox Code Playgroud)
那个有优雅解决方案的人呢?
谢谢 !
dev*_*ppy 13
update_all采用字符串,数组或散列(但不能混合和匹配).在数组的情况下,它需要ActiveRecord数组条件.所以你应该能够做到这样的事情:
MyModel.where(state: :foo).update_all([
'timespent = timespent + 500, state = ?, updated_at = ?',
'bar',
DateTime.current
])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2450 次 |
| 最近记录: |