Rails-Migrationen: self.up und self.down versus change


85

Es sieht so aus, als ob die neue Rails-Version die Methoden "change" gegenüber self.up und self.down hat.

Was passiert also, wenn eine Migration zurückgesetzt werden muss? Woher weiß es, welche Aktionen auszuführen sind? Ich habe die folgende Methode, die ich basierend auf einem Online-Tutorial implementieren muss:

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

Wie kann ich dasselbe mit der neuen Änderungsmethode tun?


Antworten:


110

Für viele Operationen können Schienen erraten, was die umgekehrte Operation ist (ohne Probleme). Was ist in Ihrem Fall beispielsweise die umgekehrte Operation add_column, die beim Rollback aufgerufen wird? Natürlich ist es das remove_column. Was ist das Gegenteil von create_table? Es ist drop_table. In diesen Fällen downist es überflüssig, dass Rails wissen, wie eine Methode zurückgesetzt und definiert wird (Sie können in der Dokumentation die Methoden sehen, die derzeit von der Änderungsmethode unterstützt werden ).

Beachten Sie jedoch, dass Sie für eine Operation die downMethode noch definieren müssen. Wenn Sie beispielsweise die Genauigkeit einer Dezimalspalte ändern, wie können Sie die ursprüngliche Genauigkeit beim Rollback erraten? Es ist nicht möglich, daher müssen Sie die downMethode definieren .

Wie gesagt, ich empfehle Ihnen, den Rails Migrations Guide zu lesen .


31

Besser Up, Down, Change verwenden:

Auf Schienen 3 (umkehrbar): Hiermit sollte eine neue Spalte nach oben hinzugefügt und alle Datensätze in der Tabelle nur nach oben gefüllt und diese Spalte nur nach unten gelöscht werden

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

def down
  remove_column :users, :location
end

Aber:

Sie mussten die Änderungsmethode vermeiden, um Zeit zu sparen. Wenn Sie beispielsweise den Spaltenwert nicht sofort nach dem Hinzufügen aktualisieren müssen, können Sie diesen Code folgendermaßen reduzieren:

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

Nach oben wird der Tabelle eine Spalte hinzugefügt und nach unten entfernt. Viel weniger Code und es ist ein Gewinn.

On Rails 4: Ein weiterer nützlicher Weg, um das, was wir brauchen, an einem Ort zu schreiben:

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

Schöne Erklärung Bruder
Bibek Sharma

rückgängig machen? ist auch ein guter Weg, um die Richtung zu sagen, in die Sie innerhalb der Änderung gehen
baash05

Nichts davon funktioniert. Ich bekomme einfach weiter ActiveRecord::IrreversibleMigration.
Wegwerfen Konto

Es gibt Situationen, in denen Rails die Migration nicht rückgängig machen können. Bitte sehen Sie ihre Hilfe
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

Danke. Aber was würde passieren, wenn Sie zurückrollen würden? würde es wissen, was zu tun ist?
BanditKing

3
Ich verschlief. Aldo 'xoen' Giambelluca erklärt alles.
nichts Besonderes-hier
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.