重命名rails迁移中列的每个条目(或行)

时间:2012-09-28 19:01:32

标签: ruby-on-rails rails-migrations

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

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

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

3 个答案:

答案 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