Wygląda na to, że nowa wersja railsów ma metody "change" w porównaniu z self.up i self.down.
A więc co się dzieje, gdy trzeba cofnąć migrację, skąd wiadomo, jakie czynności należy wykonać. Mam następującą metodę, którą muszę zaimplementować na podstawie samouczka online:
class AddImageToUsers < ActiveRecord::Migration
def self.up
add_column :users, :image_file_name, :string
add_column :users, :image_content_type, :string
add_column :users, :image_file_size, :integer
add_column :users, :image_updated_at, :datetime
end
def self.down
remove_column :users, :image_file_name, :string
remove_column :users, :image_content_type, :string
remove_column :users, :image_file_size, :integer
remove_column :users, :image_updated_at, :datetime
end
end
Jak mogę zrobić to samo, korzystając z nowej metody zmiany?
ruby-on-rails
migration
bandytaKing
źródło
źródło
Odpowiedzi:
W przypadku wielu operacji szyny mogą odgadnąć, co to jest operacja odwrotna (bez problemów). Na przykład w twoim przypadku jaka jest odwrotna operacja
add_column
wywołania podczas wycofywania zmian ? Oczywiście, że takremove_column
. Co jest odwrotnościącreate_table
? To jestdrop_table
. Więc w takich przypadkach rails wiedzą, jak wycofać zmiany i zdefiniowaniedown
metody jest zbędne (w dokumentacji można zobaczyć metody obecnie obsługiwane z metody change ).Ale zwróć uwagę, ponieważ w przypadku jakiejś operacji nadal musisz zdefiniować
down
metodę , na przykład jeśli zmienisz precyzję kolumny dziesiętnej, jak odgadnąć oryginalną dokładność przy wycofywaniu zmian? Nie jest to możliwe, więc musisz zdefiniowaćdown
metodę.Jak powiedziałem, proponuję przeczytać przewodnik po migracji Railsów .
źródło
Lepiej używać Góra, Dół, Zmień:
On Rails 3 (Reversible): który powinien dodać nową kolumnę w górę i wypełnić wszystkie rekordy w tabeli tylko na górze i usunąć tę kolumnę tylko w dół
def up add_column :users, :location, :string User.update_all(location: 'Minsk') end def down remove_column :users, :location end
Ale:
Trzeba było unikać metody zmiany, która pozwala zaoszczędzić trochę czasu. Na przykład, jeśli nie musisz aktualizować wartości kolumny natychmiast po jej dodaniu, możesz skrócić ten kod w ten sposób:
def change add_column :users, :location, :string end
Na górze doda kolumnę do tabeli i usunie ją w dół. Dużo mniej kodu, a to zysk.
On Rails 4: jeszcze jeden przydatny sposób na zapisanie potrzebnych nam informacji w jednym miejscu:
def change add_column :users, :location, :string reversible do |direction| direction.up { User.update_all(location: 'Minsk') } end end
źródło
ActiveRecord::IrreversibleMigration
.class AddImageToUsers < ActiveRecord::Migration def change add_column :users, :image_file_name, :string add_column :users, :image_content_type, :string add_column :users, :image_file_size, :integer add_column :users, :image_updated_at, :datetime end end
źródło