0

背景以下のよう な
Rails移行スクリプトがあり ます 。......0011_update_column1_for_internal_projects.rb
...
... 0022_create_audits.rb



モデルで発生したイベントを追跡するためにAuditsテーブルを更新するInternalProjectモデルのafter_create/update/deleteコールバックを作成しました。

コードスニペット
DB移行スクリプト--0011--のself.upメソッドは次のように定義されています。

def self.up  
    InternalProject.all.each do |project|
        project.column1 = project.column2
        project.save!
    end
end  

副作用
0022スクリプトでは、内部プロジェクトのシードデータをロードするためのテストフィクスチャがあるため、スクリプト0011の移行に失敗する状況に陥りました。これは失敗します。これは、InternalProjectの保存中にコールバックがトリガーされ、DB状態のその瞬間に、0022が実行されていないため、監査テーブルが存在しないため、テーブルが存在しないことを嘆くSQLエラーが発生するためです。 。

私の質問1.InternalProjectの
保存時にコールバックが呼び出されないようにするには、0011 DB移行スクリプトを修正するにはどうすればよいですか?これを行うためのきちんとした方法を知りたいです。
2.そのような更新スクリプトが削除されるのではないかと思います。それは悪い考えですか?DB移行でのデータ操作用のスクリプトが必要ですか?
3. DB移行スクリプトにデータ操作スクリプトを含める必要がありますが、それについて何かできることはありますか?

4

2 に答える 2

1

これを 0011 移行に入れてみてください

  def self.up  
    InternalProject.all.each do |project|
      project.column1 = project.column2
      project.save(:validate => false) # don't run validations! (notice we're calling `save` and NOT `save!`)
    end
  end
  1. 上記を参照

  2. 移行でデータを操作して、スキーマの進化に準拠させるのは普通のことです。ただし、プロジェクトを新しい環境にデプロイするとき (たとえば、初めて本番環境にデプロイするとき) はrake db:create、移行を実行する代わりに実行する必要があります。

  3. あなたの質問を理解できるかどうかはわかりませんが、(別のスクリプトではなく) 移行内でデータ操作を行うことは理にかなっています。一緒に属しているものを一緒に保管してください。とはいえ、データを移行するために別の移行ファイルを用意することを妨げるものは何もありません。

于 2011-01-13T20:02:34.860 に答える
0

以下のように、ANSI互換のSQLスクリプトをコードブロックに挿入することになりました。失敗しない方法は考えられませんでした。

  def self.up
     InternalProject.all.each do |internal_project|
          InternalProject.connection.execute("UPDATE projects SET sales_leader='#{internal_project.owner_name}' where type='InternalProject' and owner_id=#{internal_project.owner_id}")
     end
  end   

誰かがこれよりも良い解決策を考えている/持っている場合は、あなたの考え/経験を投稿してください.

于 2011-02-02T17:38:58.557 に答える