8

Wie kann ich in einer Rails-Anwendung die Änderungen an Modellen migrieren? Zum Beispiel weiß ich, dass wenn ich ein Modell mit dem Befehl "rails g model Person name: string" erzeuge, auch eine Migration erstellt wird. Wenn ich nach diesem Schritt jedoch zum erstellten Modell "Person" gehe und ein neues Attribut hinzufüge, wird dieses neue Attribut automatisch zu einer Migration für spätere Persistenz in der Datenbank hinzugefügt? Oder schaue ich das von der falschen Seite an, und ein Attribut sollte zu einer Migration hinzugefügt und dann zu einem Modell hinzugefügt werden?Ruby on Rails: Wie migriert man Änderungen an Modellen?

Grüße

Antwort

9

Sie können nicht wirklich „add“ ein Attribut zu einem Modell, tun Sie, dass durch die Migrationsdatei erstellen und es läuft - Rails Zahlen heraus, welche Attribute ein Modell basierend auf welchen Spalten in der Datenbank hat. Sie müssen jedoch do dem Modell eine Zeile hinzufügen, um das Attribut auf die weiße Liste zu setzen, wenn Sie es über die Massenzuweisung aktualisieren möchten. Deshalb werden Sie oft eine Zeile wie diese in Activerecord Modelle sehen:

attr_accessible :name 

Aber das ist optional und nicht wesentlich für das Hinzufügen des Attributs.

Um tatsächlich das neue Attribut zu Ihrem Modell hinzuzufügen, erstellen Sie zuerst eine Migration mit:

rails g migration AddAddressToPerson address:string 

, dass die Migrationsdatei in dem db/Migration/Verzeichnis erstellen. (Das Formular "AddXXXToYYY" und "RemoveXXXFromYYY" wird unter Schienen verstanden, um "Hinzufügen (oder Entfernen) einer neuen Spalte zum Modell XXX" zu bedeuten, siehe documentation für Details). In diesem Fall habe ich ein Attribut namens address hinzugefügt, das eine Zeichenkette ist, aber Sie könnten das ändern, was immer Sie wollen. wenn Sie auf das Attribut Massenzuordnung zulassen möchten, fügen Sie das Attribut in die Liste der Argumente zu attr_accessible

rake db:migrate 

Schließlich:

Dann tatsächlich die Datenbank zu aktualisieren, müssen Sie die Migration mit rake laufen :

attr_accessible :name, :address 

Das sollte es tun.

+0

FYI: Ihre 'Massenaufgabe' Link gibt mir eine 404. – Niek

+0

Danke, Link entfernt. –

2

Wenn Sie das neue Attribut mit attr_accessor hinzufügen, werden Sie nichts mit Migrationen tun müssen, aber Ihre Änderungen werden nicht in der Datenbank gespeichert werden.

Wenn Sie Ihre Änderungen beibehalten möchten, müssen Sie das Attribut mithilfe einer migration Ihrem Modell hinzufügen. Sie können nur eine Textdatei mit der richtigen Struktur erstellen, Migrationen sind nichts Schickes, aber es ist viel einfacher, auf diese Weise rails generate migration AddLastNameFieldToUsers zu generieren. Der Inhalt einer solchen Datei angepasst werden könnte wie folgt aussehen:

class AddLastNameFieldToUsers< ActiveRecord::Migration 
    def change 
    add_column :users, :last_name, :string 
    end 
end 
0

Sie müssen dem Modell keine Attribute direkt hinzufügen. Rails (eigentlich ActiveRecord) leitet es automatisch ab. Für die Liste der Attribute für die Modellklasse sucht AR nach einer Tabelle mit einer Pluralform des Modellnamens (wenn das Modell Auftrag ist, sucht es nach Attributen in der Auftragstabelle). Es ist Teil des Design-Features namens CoC - Convention over Configuration.

Wenn Sie also ein Attribut hinzufügen müssen, müssen Sie eine Migration erstellen, um dieses Feld in die Spalte einzufügen, wie in anderen Antworten erwähnt.