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

如何使用新的更改方法执行相同操作?


Answers:


110

对于许多操作,导轨可以猜测什么是逆操作(无问题)。例如,在您的情况下,add_column回滚时调用的反向操作是什么?当然是remove_column。的逆是create_table什么?是drop_table。因此,在这些情况下,rails知道如何回滚和定义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

但:

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

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

不错的解释兄弟
Bibek Sharma

还原?也是告诉您变更方向的好方法
baash05 '16

这些都不起作用。我只是不断ActiveRecord::IrreversibleMigration
扔掉帐户,

在某些情况下,Rails无法回滚迁移。请查看他们的帮助
Kaleem乌拉

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解释了一切。
没什么特别的,这里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.