7

Railsプロジェクトの2つのブランチで作業していて、各プロジェクトに列を追加するための移行があるという問題に遭遇しました。当時、問題を引き起こし、データベースの状態を正しく表すためrake db:migrate:resetに私だけに頼っていました。schema.rbある時点で、ブランチAによって追加された列がブランチBのスキーマに入るという問題に遭遇しました。migrate:resetオプションではなかったため、スキーマファイルを手動で編集することにしました。基本的に、ブランチBのschema.rbで不要な列をブランチAから削除するこの変更をコミットしました。

ブランチAをマスターにマージした後に問題が発生しました。ブランチBをマスターにリベースしようとしたとき、スキーマファイルの列(マスターにあるために関連するようになりました)を削除するために、Bでそのコミットがまだありました。Gitはこれに対する競合を認識せず、自動マージしました。リベースの最後に、スキーマがマスターにあるものと矛盾していることがわかりました。

私の修正は、スキーマファイルを再度編集し、以前に削除した列をスキーマファイルに手動で追加することです。私の質問は:これは型破りだと考えられていますか?危険な?ハッキー?

現在、1つの列が含まれていますが、これに複数の列の削除/追加が含まれる場合、(危険な?)ソリューションは、より多くの問題とdb/schema.rbの不整合につながる可能性があります。

4

1 に答える 1

10

一般に、ファイルを編集することは悪い習慣と考えられていschema.rbます。

移行に関するRailsガイドによると:

移行は、強力な場合もありますが、データベーススキーマの信頼できるソースではありません。その役割は、db / schema.rbか、ActiveRecordがデータベースを調べて生成するSQLファイルのいずれかに分類されます。これらは編集用に設計されたものではなく、データベースの現在の状態を表すだけです。

schema.rb新しい移行を実行するたびに更新されます:

db:migrateを実行すると、db:schema:dumpタスクも呼び出され、データベースの構造に一致するようにdb/schema.rbファイルが更新されることに注意してください。

少し時間をかけて整理し、schema.rbファイルを軌道に戻し、最新の移行セットまで修正することをお勧めします。

于 2012-07-03T02:49:06.837 に答える