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

对于许多操作,rails 可以猜测逆操作是什么(没有问题)。例如,在您的情况下,add_column回滚时调用的反向操作是什么?当然是remove_column。的倒数是create_table什么?是drop_table。因此,在这些情况下,rails 知道如何回滚和定义down方法是多余的(您可以在文档中看到change 方法当前支持的方法)。

但要注意,因为对于某些操作,您仍然需要定义down方法,例如,如果您更改小数列的精度,如何猜测回滚时的原始精度?这是不可能的,所以你需要定义down方法。

如前所述,我建议您阅读Rails 迁移指南

于 2012-04-28T16:54:46.180 回答
35

更好地使用向上,向下,更改:

On Rails 3 (Reversible):它应该在 up 上添加新列并仅在 up 时填写 table 中的所有记录,并且只在 down 时删除此列

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

def down
  remove_column :users, :location
end

但:

您必须避免使用可以节省一些时间的更改方法。例如,如果您不需要在添加后立即更新列值,您可以将此代码缩减为如下所示:

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

向上它会将列添加到表中并在向下删除它。代码少得多,这是一种利润。

在 Rails 4 上:在一个地方编写我们需要的东西的另一种有用的方法:

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 回答