Migrazioni di Rails: self.up e self.down versus change


86

Sembra che la nuova versione di rails abbia "change" rispetto ai metodi self.up e self.down.

Quindi cosa succede quando si deve ripristinare una migrazione come fa a sapere quali azioni eseguire. Ho il seguente metodo che devo implementare sulla base di un tutorial 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

Come posso fare lo stesso utilizzando il nuovo metodo di modifica?


Risposte:


110

Per molte operazioni rails può indovinare qual è l'operazione inversa (senza problemi). Ad esempio, nel tuo caso qual è l'operazione inversa di add_columnchiamare quando esegui il rollback? Certo che lo è remove_column. Qual è il contrario di create_table? È drop_table. Quindi in questi casi rails sa come eseguire il rollback e definire un downmetodo è superfluo (puoi vedere nella documentazione i metodi attualmente supportati dal change method ).

Ma faidown attenzione perché per qualche tipo di operazione devi ancora definire il metodo , ad esempio se modifichi la precisione di una colonna decimale come indovinare la precisione originale al rollback? Non è possibile, quindi è necessario definire il downmetodo.

Come detto, ti suggerisco di leggere la Rails Migrations Guide .


33

Meglio usare Su, Giù, Cambia:

Su Rails 3 (Reversibile): che dovrebbe aggiungere una nuova colonna in alto e riempire tutti i record nella tabella solo in alto, ed eliminare questa colonna solo in basso

def up
  add_column :users, :location, :string
  User.update_all(location: 'Minsk')
end

def down
  remove_column :users, :location
end

Ma:

Dovevi evitare di utilizzare il metodo di modifica che consente di risparmiare tempo. Ad esempio, se non hai bisogno di aggiornare il valore della colonna immediatamente dopo l'aggiunta, ridurrai questo codice in questo modo:

def change
  add_column :users, :location, :string
end

In alto aggiungerà una colonna alla tabella e la rimuoverà in basso. Molto meno codice ed è un profitto.

In Rails 4: un altro modo utile per scrivere ciò di cui abbiamo bisogno in un unico posto:

def change
  add_column :users, :location, :string
  reversible do |direction|
    direction.up { User.update_all(location: 'Minsk') }
  end
end

Bella spiegazione fratello
Bibek Sharma

ripristinare? è anche un buon modo per indicare la direzione in cui stai andando all'interno del cambio
baash05

Niente di tutto questo funziona. Continuo a ricevere ActiveRecord::IrreversibleMigration.
Conto buttato via

ci sono situazioni in cui i rails non riescono a ripristinare la migrazione. si prega di visualizzare il loro aiuto
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

Grazie. Ma cosa succederebbe se dovessi tornare indietro. saprebbe cosa fare?
Bandit King,

3
Ho dormito troppo. Aldo 'xoen' Giambelluca spiega tutto.
niente di speciale qui il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.