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?

Author: KL-7, 2012-04-28

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.

 111
Author: Aldo 'xoen' Giambelluca,
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
 33
Author: Kaleem Ullah,
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
 1
Author: nothing-special-here,
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