Ruby update_all with CASE和WHEN

时间:2015-04-16 11:50:28

标签: mysql ruby-on-rails ruby activerecord sql-update

是否可以使用ActiveRecord的update_all函数创建MySQL查询,如:

UPDATE `key_value_store`
SET `key` =
CASE `key`
  WHEN 'xxxxxxx' THEN 'yyyyyyyy'
  WHEN 'zzzzzzz' THEN 'wwwwwwww'
  ...
END
WHERE `key` IN ('some key', 'some other key', ...)
LIMIT 1000

我现在拥有的是

keys = ['some key', 'some other key', ...]
Keyvaluemodel.where(:key => keys).limit(1000).update_all()

所以问题是,update_all括号中的代码是什么,所以这个更新按照我想要的方式工作?

2 个答案:

答案 0 :(得分:2)

除非您编写一些原始SQL或自定义查询,否则这是不可能的。但考虑到你只有两个案例,写两个查询就够了。

如果you look at the docs您将看到唯一的参数update_all接受的是SQL查询的SET部分。

  

updates - 表示SQL语句的SET部分的字符串,数组或散列。

因此,要么编写自定义查询,要么将更新拆分为多个查询,每个CASE一个。

Model.where(key: key_1).limit(1000).update_all(key: new_key)
Model.where(key: key_2).limit(1000).update_all(key: new_key)

答案 1 :(得分:0)

在参数中使用键值对,如:

Keyvaluemodel.where(:key => keys).limit(1000).update_all(:key=>'new key')