90

新しい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

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

4

3 に答える 3

114

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

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

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

于 2012-04-28T16:54:46.180 に答える
35

Up、Down、Change を使用することをお勧めします。

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
于 2015-09-28T10:24:23.477 に答える
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
于 2012-04-28T15:58:32.767 に答える