3

RAILS 移行を使用して、データベース内のテーブル データを更新する必要があります。

Sample:
Table: Table_A(Col_A(number), Col_B(varchar),...)
Query: UPDATE Table_A SET Col_B = "XXX" where Col_B = "YYY"

RAILS Migrations を使用してこれを行う最善の方法は何でしょうか。データベース内のデータを更新する方法が RAILS 移行であるかどうかさえわかりません。どんな説明でも役に立ちます。

4

5 に答える 5

5

rakeタスクでデータベースデータの変更を行うことを好みます。

  1. 明らか
  2. 繰り返し可能
  3. 後で実行されませんrake db:migrate

コード:

namespace :update do
  desc "Update table A to set Col_B to YYY"
    task :table_a => :environment do
      TableA.where(Col_B: "YYY").update_all(Col_B: "XXX")
    end
  end
end

次にrake update:table_a、更新を実行できます。

于 2013-03-20T18:28:26.870 に答える
5

通常、この種のビッグ データの更新は rake タスクで行う方が適切です。通常、rake change_lots_of_data:report と rake change_lots_of_data:update の 2 つのバージョンがあるように記述します。「レポート」バージョンは、where 句を実行するだけで、変更される内容のリストを吐き出します。「更新」バージョンは、まったく同じ where 句を使用しますが、変更を行います。

このようにすることのいくつかの利点は次のとおりです。

  • データベース構造を変更するために移行が保存されます
  • 正しいレコードが更新されることを確認するために、「レポート」バージョンを何度でも実行できます。
  • rake タスクによって呼び出されるクラスを単体テストする方が簡単です。
  • 再度変更を行うために同じ基準を適用する必要がある場合は、rake タスクを再度実行するだけです。移行でそれを行うことは可能ですが、よりトリッキーです。
于 2013-03-20T18:26:04.373 に答える
4

これはレーキタスクで行う必要があります...

namespace :onetime do
  task :update_my_data => :environment do
    TableA.where(Col_B: "YYY").update_all(Col_B: "XXX")
  end
end

次に、デプロイした後:

rake onetime:update_my_data

私の会社では、本番環境で実行された後、1 回限りの名前空間 rake タスクの内容を削除します。私たちにとっては単なるコンベンションだと思います。

メソッドの詳細update_all: http://apidock.com/rails/ActiveRecord/Relation/update_all

于 2013-03-20T18:13:20.133 に答える
1

次のようにできます。

 class YourMigration < ActiveRecord::Migration
   def up    
     execute('UPDATE Table_A SET Col_B = "XXX" where Col_B = "YYY"')
   end

   def down
   end
 end

または:

 class YourMigration < ActiveRecord::Migration
   def up   
     update('UPDATE Table_A SET Col_B = "XXX" where Col_B = "YYY"')
   end

   def down
   end
 end
于 2013-03-20T18:03:21.467 に答える
0
ActiveRecord::Base.connection.execute("update Table_A set Col_B = 'XXX'  where Col_B = 'YYY')
于 2013-03-20T18:03:00.417 に答える