是否可以使用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括号中的代码是什么,所以这个更新按照我想要的方式工作?
答案 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')