Rails 迁移:自我向上和自我向下与更改



看起来新的rails版本与self.up和self.down方法相比具有"change"。

那么,当必须回滚迁移时会发生什么,它如何知道要执行哪些操作。我需要根据在线教程实现以下方法:

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

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

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

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

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

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

在 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

向上,它将向表添加列并将其删除。更少的代码,这是一种利润。

On 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

相关内容

  • 没有找到相关文章

最新更新