Rails ActiveRecord - update_all:如何使用混合类型的参数一次更新多个字段

时间:2016-04-18 15:02:30

标签: ruby-on-rails ruby activerecord

我有一个用例,我想使用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   
])

请注意,上面的语法不起作用,因为它会尝试查找占位符并替换值,因此会忽略state: :barupdated_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(', '))

有人在那里找到优雅的解决方案吗?

谢谢!

1 个答案:

答案 0 :(得分:12)

update_all采用字符串,数组或散列(但您无法混合和匹配)。在数组的情况下,它需要ActiveRecord数组条件。所以你应该能够做到这样的事情:

.off