2017-01-26 6 views
1

大きな編集は、私が以前に持っていた特定のものではなく、抽象的な「行動」の話です。それらはほんの一例でした。 (;などの列を変更するテーブル、インデックスを作成、彼らは何でも)成功し、その後、すべてが素晴らしいです、すべての3つのアクションが場合「ロールバック」マルチDDL移行

class XyzMigration < ActiveRecord:Migration 
    def change 
    first_action :a do ... 
    some_action :b do ... 
    other_action :c do ... 
    end 
end 

シナリオは私が移行を持っています。

ただし、アクションbが失敗した場合、移行はaを正常に実行してから停止します。今aは、それが何であっても、行われてきたが、移行が完了していない:

問題

ここで問題があります。つまり、私が(bの障害につながる問題を手動で修正した後で)移行を再試行すると、aがすでに完了しているというエラーが表示され、手動でaを元に戻す必要があります。

私が期待する何

私は移行の後者のステップが失敗した場合、すべて完了したステップを元に戻すために安全であることのRailsを伝えたい

。技術的に、Railsはこれを行うことができます。なぜなら、a)元に戻すメカニズムが存在するからです(私たちはrake db:rollbackを使用して完全な移行を取り消すことができます)。b)​​Railsは各ステップについて、可逆であるかどうかを知っています。それで、失敗した前のすべての前のステップが可逆的であると仮定すると、元に戻すのが安全であることがわかります。

これを行うオプション、フラグ、メカニズムはありますか?私はロジックを自分自身でプログラミングすることを望んでおらず、アクションが実行される必要があるかどうかを事前にチェックすることも、例外をキャッチすることもありません。テーブルは、テーブルを作成する前に存在している場合について

+0

MySQLを使用していますか? – denys281

答えて

1

チェック:

# In Rails 2, 3 & 4: 
unless ActiveRecord::Base.connection.table_exists?('a') 
    create_table :a do ... 
end 
unless ActiveRecord::Base.connection.table_exists?('b') 
    create_table :b do ... 
end 
# ... 



# In rails 5: 
unless ActiveRecord::Base.connection.data_source_exists?('a') 
    create_table :a do ... 
end 
unless ActiveRecord::Base.connection.data_source_exists?('b') 
    create_table :b do ... 
end 
# ... 
+0

質問に追加した説明を参照してください。 – AnoE

関連する問題