0

ハッシュに基づいてステータス列の値を再マップしたい。

たとえば、ステータスがaの場合は、bに変更します。

Railsでこれを行い、列のすべての値を変更する1つのdb呼び出しを実行するように最適化するにはどうすればよいですか?

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

ハッシュがテーブルと比較して小さい場合はUPDATE ... WHERE ...、トランザクションにラップされたハッシュの各エントリに対してSQLを実行できます。

于 2012-09-28T19:07:14.733 に答える
0

読みやすくするためにヒアドキュメントを使用して、代わりにこれを行いました。

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 に答える