8

W aplikacji Rails, w jaki sposób mogę przeprowadzić migrację zmian, które wprowadzam w modelach? Na przykład, wiem, że jeśli utworzę model z komendą "rails g model Person nazwa: string", zostanie również utworzona migracja. Jeśli jednak po tym kroku przejdę do utworzonego modelu "Osoba" i dodasz nowy atrybut, czy ten nowy atrybut zostanie automatycznie dodany do migracji w celu późniejszego utrzymania w bazie danych? A może patrzę na to z niewłaściwej strony, a atrybut powinien zostać dodany do migracji, a następnie dodany do modelu?Ruby on Rails: jak migrować zmiany wprowadzone w modelach?

Pozdrowienia

Odpowiedz

9

Naprawdę nie można „dodać” atrybut do modelu, to zrobić tworząc plik migracji i uruchomienie go - Rails dane jakie atrybuty ma model na podstawie kolumn znajdujących się w bazie danych. Jednak musisz do dodać linię do modelu, aby dodać atrybut do białej listy, jeśli chcesz mieć możliwość aktualizacji za pomocą przypisania masy. Dlatego często widzisz taką linię w aktywnych modelach:

attr_accessible :name 

Jest to opcjonalne i nie jest konieczne dodawanie atrybutu.

Aby faktycznie dodać nowy atrybut do modelu, najpierw utworzyć migracji z:

rails g migration AddAddressToPerson address:string 

który stworzy plik migracji w db/migracji/katalogu. (Formularze "AddXXXToYYY" i "RemoveXXXFromYYY" są rozumiane przez tory jako "dodawaj (lub usuwaj) nową kolumnę do modelu XXX", zobacz szczegóły pod adresem documentation). W tym przypadku dodałem atrybut o nazwie address, który jest ciągiem znaków, ale można go zmienić na dowolnie wybrany.

Wtedy faktycznie aktualizuje bazę danych, trzeba wykonać migrację z rake:

rake db:migrate 

Wreszcie, jeśli chcesz, aby umożliwić masowe zadanie na ten atrybut, należy dodać atrybut do listy argumentów attr_accessible :

attr_accessible :name, :address 

To powinno wystarczyć.

+0

FYI: Twoje łącze "przypisanie masy" daje mi 404. – Niek

+0

Dzięki, link usunięty. –

2

Jeśli dodajesz nowy atrybut z attr_accessor, nie trzeba nic robić z migracji, ale zmiany nie będą przechowywane w bazie danych.

Jeśli chcesz utrwalić swoje zmiany, musisz dodać atrybut do modelu, używając numeru migration. Możesz po prostu utworzyć plik tekstowy, o odpowiedniej strukturze, migracje nie są niczym nadzwyczajnym, ale generowanie go na takim poziomie jest o wiele łatwiejsze: rails generate migration AddLastNameFieldToUsers. Zawartość takiego pliku może być dostosowane do wyglądać tak:

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

Nie trzeba dodawać atrybutów bezpośrednio do modelu. Railsy (w rzeczywistości ActiveRecord) automatycznie je tworzą. Dla listy atrybutów dla klasy modelu AR wyszukuje tabelę z mnogą formą nazwy modelu (jeśli model to Zlecenie, to będzie szukał atrybutów w tabeli zamówień). Jest to część projektu o nazwie CoC - Convention over Configuration.

Więc jeśli musisz dodać atrybut, musisz utworzyć migrację, aby dodać to pole do kolumny, jak wspomniano w innych odpowiedziach.