7

次のプロジェクトでRubyonRailsを使用することを検討しています。Rails Webサイトの展開を理解するのは簡単です(Phusion Passengerを使用するように聞こえます)

しかし今、私はデータベースを理解しようとしています。「データベースの移行」について多くのことを目にします。これにより、rubyコードを使用してデータベースを更新できます。また、これらの移行のアップバリアントとダウンバリアントの両方を作成できることもわかりました。

しかし、私はこれが一方向でどのようにきれいに機能するかを理解することしかできません。突然「カラー列をnullにすることはできません」と言った場合を想像してみてください。したがって、upはそれを必須にし、すべてのNULLエントリにデフォルト値を与えます。しかし、ダウンは何をしますか?開始時と同じであることに関心がある場合は、デフォルト値をNULLに戻すことはできません。

これは、本番環境へのリリースではそれほど重要ではありません。それはおそらく一方向(方向)で行われるでしょう。ただし、コードレビューと、チェックインを許可する前にビルドを実行するボットを設定するためにGerritを使用したいと思います...

では、それはどのように機能するのでしょうか?あるコードレビューから次のコードレビューまで、ビルドサーバーは新しいコードセットをチェックアウトし、移行を実行しますか?しかし、これが発生すると、以前の移行コードも保持されないため、ダウンステップをどのように実行できますか?より簡単な例として、古いバージョンのコードをチェックアウトして「dbmigrate」を逆方向に実行する方法がわかりません。

4

1 に答える 1

3

はい、古いバージョンのコードをチェックアウトしてから、新しいバージョンのコードからダウンマイグレーションを実行することはできません。古いコードにロールバックする前に、ダウンマイグレーションを実行する必要があります。

ダウンマイグレーションが実用的でない、または不可能な場合が多くあります。それは必ずしも悪いことではありません。これは、データベースを以前の状態に復元できない「戻り値のないポイント」を定義したことを意味します。

テーブルの作成や列の追加などの移行は、そのテーブルを破棄するか、その列を削除するだけで簡単に元に戻すことができます。ただし、デフォルト値の追加やデータの移動など、より複雑なことをしている場合は、この移行を元に戻すことはできないことをRailsに伝えることができます。

def down
  raise ActiveRecord::IrreversibleMigration
end

Gerritがデータベースについて何も想定しないことをお勧めします。新しいバージョンがデプロイされるたびに新しいデータベースで開始し、db:migrateすべての移行を実行するために実行する必要があります。factory_girlのようなgemを使用して、テスト目的でアプリにデモデータを入力できます。

于 2012-10-26T22:29:28.100 に答える