Railsの移行:self.upおよびself.downと変更


86

新しいrailsバージョンには、self.upおよびself.downメソッドに対する「変更」メソッドがあるようです。

したがって、移行をロールバックする必要がある場合はどうなりますか。実行するアクションをどのように認識しますか。オンラインチュートリアルに基づいて実装する必要がある次のメソッドがあります。

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

新しい変更方法を使用して同じことを行うにはどうすればよいですか?


回答:


110

多くの操作では、railsは(問題なく)逆操作とは何かを推測できます。たとえば、あなたの場合、add_columnロールバックするときに呼び出す逆の操作は何ですか?もちろんremove_columnです。の逆はcreate_table何ですか?ですdrop_table。したがって、これらの場合、レールはdownメソッドをロールバックして定義する方法が不要であることを知っています(ドキュメントで、changeメソッドから現在サポートされているメソッドを確認できます)。

ただし、ある種の操作では、downメソッドを定義する必要があるため、注意が必要です。たとえば、小数列の精度を変更した場合、ロールバック時に元の精度を推測する方法はありますか?それは不可能なので、downメソッドを定義する必要があります。

前述のように、Rails移行ガイドを読むことをお勧めします。


33

上、下、変更を使用する方が良い:

Rails 3(リバーシブル):上に新しい列を追加し、上にのみテーブル内のすべてのレコードを入力し、下にのみこの列を削除する必要があります

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

def down
  remove_column :users, :location
end

だが:

時間を節約できるchangeメソッドの使用は避けなければなりませんでした。たとえば、列の値を追加した直後に更新する必要がない場合は、次のようにコードを切り詰めます。

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

上ではテーブルに列を追加し、下では削除します。コードがはるかに少なく、それは利益です。

Rails 4:必要なものを1か所に書くためのもう1つの便利な方法:

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

素敵な説明仲間
Bibek Sharma 2016

元に戻す?変化の中で進んでいる方向を伝える良い方法でもあります
baash05 2016

これはどれも機能しません。私はただ得続けActiveRecord::IrreversibleMigrationます。
アカウント

Railsが移行のロールバックに失敗する状況があります。彼らの助け
Kaleem Ullah 2017年

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

ありがとう。しかし、ロールバックするとどうなるでしょうか。それは何をすべきか知っていますか?
banditKing 2012

3
寝過ごした。Aldo'xoen'Giambellucaがすべてを説明します。
何も特別ではありません
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.