Migracje Rails: self.w górę i siebie.w dół a zmiana
Wygląda na to, że nowa wersja rails ma" change " versus self.w górę i siebie.metody w dół.
Więc co się dzieje, gdy trzeba cofnąć migrację, skąd wie, jakie działania wykonać. Mam następującą metodę, którą muszę wdrożyć w oparciu o samouczek 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 używając nowej metody zmiany?
3 answers
Dla wielu operacji rails może odgadnąć, co jest operacją odwrotną (bez problemów). Na przykład, w Twoim przypadku, jaka jest odwrotna operacja add_column
, aby wywołać po wycofaniu? Oczywiście, że to remove_column
. Jaka jest odwrotność create_table
? drop_table
. Tak więc w takich przypadkach rails wie jak cofnąć i definiowanie metody down
jest zbędne(można zobaczyć w dokumentacji metody aktualnie obsługiwane z metody change ).
Ale zwróć uwagę, ponieważ dla jakąś operację trzeba jeszcze zdefiniować metodę down
, na przykład jeśli zmienisz precyzję kolumny dziesiętnej jak odgadnąć oryginalną precyzję po wycofaniu? Nie jest to możliwe, więc należy zdefiniować metodę down
.
Jak już wspomniałem, sugeruję przeczytanie Rails Migrations Guide.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-28 17:01:26
Lepiej używać w górę, w dół, zmienić:
On Rails 3 (Reversible): który powinien dodać nową kolumnę w górę i wypełnić wszystkie rekordy w tabeli tylko w górę, i tylko usunąć tę kolumnę 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ć stosowania 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 przyciąć ten kod w następujący sposób:
def change
add_column :users, :location, :string
end
W górę doda kolumnę do stół i usuń go na dół. Znacznie mniej kodu i to zysk.
On Rails 4: jeszcze jeden przydatny sposób na napisanie tego, czego potrzebujemy w jednym miejscu:
def change
add_column :users, :location, :string
reversible do |direction|
direction.up { User.update_all(location: 'Minsk') }
end
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-28 10:24:23
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-28 15:58:32