我想根据哈希重新映射状态列中的值。
例如,如果状态为 a,则将其更改为 b。
如何在 Rails 中执行此操作并对其进行优化,以便它执行一个更改列中所有值的数据库调用?
我想根据哈希重新映射状态列中的值。
例如,如果状态为 a,则将其更改为 b。
如何在 Rails 中执行此操作并对其进行优化,以便它执行一个更改列中所有值的数据库调用?
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
我这样做了,使用 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
如果散列与表相比较小,您可以UPDATE ... WHERE ...
对散列中的每个条目执行 SQL,将其包装到事务中。