8

railsを実行するたびにrake db:migrate、schema.rbファイルを変更することにしました。これが完全に合理的な場合もありますが、理由もなく実行しているように見える場合もあります。私が混乱しているのは、gitから新しい移行と新しいバージョンのschema.rbをプルしてから、を実行する場合rake db:migrateです。この移行には新しいバージョンのschema.rbファイルが付属しているため、schema.rbを更新するべきではありません。ただし、レールは毎回それを変更します。これが発生すると、次のような信じられないほどばかげた変更が見つかります。

add_index "my_table", ["column1", "column2"], :name => "index_on_some_columns"

add_index "my_table", ["column2", "column1"], :name => "index_on_some_columns"

これが起こったとき、私はただ走っgit checkout db/schema.rbて人生を続けますが、それは私を終わりのないものにします。これを行う理由はありますか?また、どうすればこれを防ぐことができますか?

編集:これはdiffからの抜粋です

@@ -165,12 +165,11 @@ ActiveRecord::Schema.define(:version => 20130206001907) do
     t.column "updated_at", :datetime
-    t.column "coordinates", :point, :srid => 4326
@@ -200,15 +199,16 @@ ActiveRecord::Schema.define(:version => 20130206001907) do
     t.column "something", :boolean
+    t.column "coordinates", :point, :srid => 4326
+    t.column "random_string", :string
     t.column "remote", :string
-    t.column "random_string", :string
   end

-  add_index "my_table", ["id", "foreign_id"], :name => "index_active_my_table_on_foreign_and_id"
-  add_index "my_table", ["id", "active"], :name => "index_my_table_on_active_and_id"
-  add_index "my_table", ["id", "content_modified_at"], :name => "index_my_table_on_content_modified_at_and_id"
+  add_index "my_table", ["foreign_id", "id"], :name => "index_active_my_table_on_foreign_and_id"
+  add_index "my_table", ["active", "id"], :name => "index_my_table_on_active_and_id"
+  add_index "my_table", ["content_modified_at", "id"], :name => "index_my_table_on_content_modified_at_and_id"
4

2 に答える 2

6

この移行には新しいバージョンのschema.rbファイルが付属しているため、schema.rbを更新するべきではありません。

これは不正確です。

Railsは移行を実行するたびにschema.rb、データベースをソースとして使用してファイルを更新します。既存のschema.rbファイルを調べるのではなく、データベースからの情報を使用して上書きするだけです。

本当の問題は、2つの異なる環境(Ruby、Rails、MySQL、オペレーティングシステムの異なる組み合わせ)で同じ移行を実行すると、schema.rbファイルを生成するときに異なる結果が得られる可能性があることです。

解決策は、コードをチェックインするすべての人が、可能な限り同じソフトウェアバージョンを使用していることを確認することです。それが不可能な場合(これはWindowsとLinuxとMacの違いであり、OSを変更したくないため)、不便に対処する必要があります。

于 2013-02-12T22:36:27.183 に答える
2

私にとって、解決策はrake db:schema:load最初のものでした。そして、理由もなくrake db:migrate私の変更をやめたよりも。schema.rb

注意:既存のデータを すべてrake db:schema:load削除し、既存のschema.rbに関してデータベースを再作成します。

于 2016-09-01T00:19:15.337 に答える