0

我想根据哈希重新映射状态列中的值。

例如,如果状态为 a,则将其更改为 b。

如何在 Rails 中执行此操作并对其进行优化,以便它执行一个更改列中所有值的数据库调用?

4

3 回答 3

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
于 2012-09-28T19:10:52.733 回答
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
于 2012-10-04T21:30:35.257 回答
0

如果散列与表相比较小,您可以UPDATE ... WHERE ...对散列中的每个条目执行 SQL,将其包装到事务中。

于 2012-09-28T19:07:14.733 回答