2010-12-03 5 views
5

最近私は、不可逆的な移行の傘の下にあるいくつかの移行を書いてきました。しかし、彼らは不可逆的な世界の終わりではありません。あなたが望むなら、それらをロールバックすることができます。私が現時点で持っているシナリオは、1対1の関係を多対多の関係に変えています。これには、列を削除して新しい結合表を作成することが含まれます。 (モデルでは2行だけでなく)。不可逆的な移行 - 中止する代わりに警告と確認をしますか?

私はダウンマイグレーションを中止する代わりに、「このマイグレーションはここにサッカーメッセージを挿入しました。あなたは進んでいますか?Y/N」と言って、マイグレーションをロールバックします。彼らは? if文の中にマイグレーションを置くだけですか?

移行を元に戻すことは不可能で、通常は理由があります(データを復元できないなど)。これらの問題は通常、手動で行うマイグレーションを作成するだけで解決されますか?

私のノービスの気持ちでは、幸せな媒体を持つことはうれしいでしょう。それは賢明ですか?たぶん、私はそれらを最初に非可逆的にする時を理解していないかもしれません。

答えて

1

可能であれば、移行を可逆にしてください。私が問題に遭遇したと思う唯一の時間は、粗く定義されたデータ・モデルからより細かいグレイン・オンへ、そして再び戻るまでです。もちろん、移行の結果に応じて、あなたのソリューションを使用しない理由はありません。下位のマイグレーションを実行している人があなたの抱えているエラーをコメントアウトし、マイグレーションを元に戻す独自のコードを書くのを止めるものは何もありませんが、データモデルを書く人は、それらの代わりに前の状態を推測する。

+0

に参加削除しますあなたのために、データモデルを書く人は、推測するのではなく元の状態に戻す方法を知るために変化します。まったく!だからこそ私はこのオプションがまだ利用可能ではなかったことに少し驚いていました。誰かがあなたが書いた例外を上書きするだけの可能性があるからです。 – Nick

+0

Rubyにはほとんどルールがありません。検討してください:http://gfredericks.com/gfrlog/post/51 私たちは常識、大会、そして良いテストに頼っています:) –

1

私は同じ質問をどうにかして苦労したので、この古い記事をちょうど見つけました。

私は多対多(HABTM)から多対多(one-to-many)に移行しました。もちろん、私は後で結合テーブルを削除したかったのです。私は展開中に結合テーブルからデータをコピーするのを忘れてしまうのが本当に怖かったです。だから私は、「警告」の移行を含めることにしました:

class DataMigrationWarning < ActiveRecord::Migration 
    def change 

    puts("********************** Data Migration Warning **********************") 
    puts("Dont forgett to save the data.") 
    puts("Next UP migration will delete table XYZ.") 
    puts("Next DOWN migration will delete field A in table BCD.") 
    puts("press y for continue.") 
    puts("press anything else for stopping.") 

    if STDIN.gets.chomp == "y" 
     puts("Ok then!") 
    else 
     fail 
    end 

    # More detailed explanation... 

    end 
end 

コマンドラインはその後、ちょうどユーザからの入力のためにそこまで待機中にすべてのものが表示されます。 yは次の移行に行くだけです。他のすべての入力は移行を停止し、それ以降はすべて停止します。

  1. 移行:

    プロセスは次のように最後に見移行

  2. 移行を警告
  3. 新しいbelong_toのための新しいフィールドを作成します:古いはそれがはるかに安全である」テーブル
+0

まさに私が探していたものです!物事を深刻にする巨大な警告のようなものはありません。ありがとう! – Andreas

関連する問題