Migracje Railsów: self.up i self.down a zmiana

86

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?

bandytaKing
źródło

Odpowiedzi:

110

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_columnwywołania podczas wycofywania zmian ? Oczywiście, że tak remove_column. Co jest odwrotnością create_table? To jest drop_table. Więc w takich przypadkach rails wiedzą, jak wycofać zmiany i zdefiniowanie downmetody 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ć downmetodę , 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ć downmetodę.

Jak powiedziałem, proponuję przeczytać przewodnik po migracji Railsów .

Aldo „xoen” Giambelluca
źródło
33

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
Kaleem Ullah
źródło
Niezłe wyjaśnienie brachu
Bibek Sharma
odwracając? jest również dobrym sposobem na określenie kierunku, w którym
zmierzasz
Nic z tego nie działa. Po prostu się dostaję ActiveRecord::IrreversibleMigration.
Wyrzuć konto
są sytuacje, w których szyny nie wykonują migracji przywracania. proszę zobaczyć ich pomoc
Kaleem Ullah
1
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
nic specjalnego
źródło
Dzięki, ale co by się stało, gdybyś się wycofał. czy będzie wiedział, co robić?
banditKing
3
Ja zaspałem. Aldo 'xoen' Giambelluca wyjaśnia wszystko.
nic specjalnego-tutaj