Rails迁移:self.up和self.down与变化

看起来像新的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 

我怎样才能使用新的更改方法做同样的事情?

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

但要注意,因为对于某种操作,你仍然需要定义down方法 ,例如如果你改变一个十进制列的精度如何在回滚时猜测原始精度? 这是不可能的,所以你需要定义down方法。

如上所述,我build议你阅读Rails Migrations Guide 。

更好地使用Up,Down,Change:

On Rails 3(Reversible):它应该在上面添加新的列,并且只填充表中的所有logging,并且只在下面删除这个列

 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 

在上面它会将列添加到表中并将其删除。 更less的代码,这是一个利润。

在Rails 4上:在一个地方写下我们需要的一个更有用的方法:

 def change add_column :users, :location, :string reversible do |direction| direction.up { User.update_all(location: 'Minsk') } end end 
 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