2013-02-12 5 views
8

Jedes Mal, wenn ich eine rake db:migrate Rails läuft, beschließt, meine schema.rb-Datei zu ändern. In einigen Fällen ist dies völlig vernünftig, aber in einigen anderen Fällen scheint es, dass es ohne Grund geschieht. Der Fall, über den ich verwirrt bin, ist, wenn ich eine neue Migration und eine neue Version von schema.rb von git abrufe und dann rake db:migrate starte. Da die neue Version der Datei schema.rb mit dieser Migration geliefert wurde, sollte ich schema.rb nicht aktualisieren. Schienen ändert es jedoch immer noch jedes Mal. Wenn dies der Fall finde ich unglaublich dumme Veränderungen wie:Rails ändert schema.rb ohne Grund

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

zu

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

Wenn dies geschieht einfach git checkout db/schema.rb und gehen mit meinem Leben, das ich laufen, aber es irkes mich ohne Ende. Gibt es einen Grund, warum es das tut, und wie kann ich es davon abhalten?

EDIT: Hier ist ein Auszug aus einem 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" 
+0

Wie ist dieser Index in Ihren Migrationsdateien definiert? – Novae

+0

poste deine Diffs – cbrulak

+0

In mehreren Fällen sagte eine Migration 'add_index: my_table, [" column2 "," column1 "]' aber das über git gelieferte Schema.rb hatte die umgekehrte Reihenfolge: 'add_index" my_table ", [" column1 ", "Spalte2"] '. Es scheint konsistent zu sein, aber jetzt frage ich mich, wie die entgegengesetzte Reihenfolge der Spalten es jemals in Code geschafft hat. Das mag naiv sein, aber könnte das etwas mit der Arbeit mit Linux/Mac zu tun haben? – wesdotcool

Antwort

6

Da die neue Version der schema.rb Datei mit dieser Migration kam, sollte ich nicht schema.rb Aktualisierung werden.

Dies ist ungenau.

Jedes Mal, wenn Rails eine Migration ausführt, aktualisiert es die Datei schema.rb mithilfe der Datenbank als Quelle. Es schaut nicht auf die existierende schema.rb Datei, es verwendet nur Informationen aus der Datenbank und überschreibt diese.

Es scheint, dass das eigentliche Problem ist, dass die gleiche Migration in zwei verschiedenen Umgebungen (verschiedene Kombinationen von Ruby, Rails, MySQL, Betriebssystemen) unterschiedliche Ergebnisse beim Generieren einer schema.rb Datei ergeben kann.

Die Lösung besteht darin, sicherzustellen, dass jeder, der Code eincheckt, die gleichen Softwareversionen verwendet, so weit wie möglich. Und wenn es nicht möglich ist (weil dies ein Unterschied zwischen Windows und Linux oder Mac ist und Sie nicht das Gefühl haben, Ihr Betriebssystem zu ändern), müssen Sie nur mit den Unannehmlichkeiten fertig werden.

+0

Danke für die Klärung, dass für mich. Ich muss sehen, ob ich etwas zusammenhacken kann, das den Dateiwechsel umgehen kann, wenn es sich nicht wirklich ändert! – wesdotcool

0

Für mich war die Lösung zuerst ein rake db:schema:load. Und als rake db:migrate hörte auf, meinen schema.rb ohne Grund zu ändern.

ACHTUNG:rake db:schema:load wird ALLE Ihrer vorhandenen Daten löschen und die Datenbank in Bezug auf bestehende schema.rb neu erstellen.