2009-04-15 12 views
11

Ich habe viel über ActiveRecord Migrationen gesprochen und darüber, ob sie verwendet werden sollten, um Daten innerhalb Ihrer Anwendung zu ändern oder nicht, manche Leute sagen ja, manche sagen nein. Meine Frage ist, wenn Sie nicht Migrationen verwenden, was dann verwenden Sie? Nur ein anderes Skript, das du schreibst?Wie ändern Sie Ihre Rails App-Daten?

Ich bin nach suggestitions auf alternativen Wegen und warum könnten sie eine bessere Idee, als nur mit Migrationen sein.

Antwort

14

Ein Problem kommt, wenn Sie die mitgelieferte verwenden

rake db:reset 

und

rake db:schema:load 

Aufgaben, die für den Aufbau der Datenbank schema.rb als Basis verwenden. So werden keine Daten geladen und Sie stecken fest.

In Agile Web Development with Rails, Third Edition, was sollten Sie (? Wenn der Ruby-Buch der „Pickaxe“ Buch ist, sollte dies die „Hängematte“ Buch sein, btw), wenn Sie nicht bereits getan haben, sagt DHH:

... Migrationen sind nicht wirklich gemeint, tragen Seed-Daten. Sie sind zu temporär in der Natur, um das zuverlässig zu tun. Migrationen sind hier, um Sie von eine Version des Schemas zum nächsten, nicht zu einem neuen Schema von Scratch-wir haben die db/schema.rb-Datei dafür zu bringen.

Also, sobald Sie tatsächlich mit einer realen Anwendung bekommen gehen, werden Menschen nicht Ihre frühen Migrationen laufen, wenn sie die Anwendung einrichten. Sie werden von beginnen, was auch immer Version in db/schema.rb gespeichert ist, und ignorieren alle diese vorherigen Migrationen. Dies bedeutet, dass alle von den Migrationen erstellten Daten nie in der Datenbank vornehmen, so Sie können es nicht verlassen.

Es gibt viele alternative Möglichkeiten, mehr permanente Seed-Daten zu haben. Am einfachsten ist es wahrscheinlich nur eine neue Datei zu erstellen, in db/seed.rb, die jene enthält Product.create ruft das wird die Setup tun. Diese Datei kann dann nach Rake db: aufgerufen werden: Schema: load erstellt das erste Schema .

+1

Eigentlich läuft 'rake db: reset' auch' rake db: seed', also werden alle Daten in Ihrer Seeds-Datei mit geladen. – lobati

4

Viele Male sind Migrationen die beste Lösung und können nicht durch ein separates Skript ersetzt werden. Stellen Sie sich folgendes Szenario vor: Die Anwendung wird bereits mit Live-Daten verwendet; Die Code-Spalte enthält einen Code in der Form "Name-Zip-Code" (ja, ich weiß, es ist hässlich, aber es passiert), und Sie möchten das in zwei Spalten, "Name" und "Zip_code" teilen, während die " Code 'Spalte.

In diesem Fall kann die Code-Spalte nicht entfernt werden, bevor die Daten in die Spalten Name und Postleitzahl übertragen werden.

1

Wenn ich einige Daten in der databse ändern müssen, ich werde eine Rake-Aufgabe erstellen, die einige Bibliotheksfunktion läuft die Arbeit zu tun.Auf diese Weise ist die Datenmanipulation wiederholbar und kann bei Bedarf auch von einer Migration ausgeführt werden.