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