我想根据哈希值在我的状态列中重新映射值。
例如,如果状态为a,请将其更改为b。
如何在Rails中执行此操作并对其进行优化,以便它执行一个更改列中所有值的db调用?
答案 0 :(得分:3)
status_changes = { "a" => "b", "c" => "d" }
status_changes.each do |old, new|
# first arg is UPDATE, second arg is WHERE
SomeModel.update_all("status = #{new}", "status = #{old}")
end
答案 1 :(得分:0)
如果哈希与表相比较小,则可以为哈希中的每个条目执行SQL UPDATE ... WHERE ...
,并将其包装到事务中。
答案 2 :(得分:0)
我这样做了,使用heredocs提高了可读性:
status_mapping = {"Open" => 1345, "Closed" => 1346, "Pending" => 1347}
query = ActiveRecord::Base.connection()
query.execute <<-SQL.strip_heredoc
UPDATE table_1
SET status = CASE
WHEN status = #{status_mapping["Open"]} THEN 0
WHEN status = #{status_mapping["Closed"]} THEN 1
WHEN status = #{status_mapping["Pending"]} THEN 2
ELSE NULL
END;
SQL