迁移文件中def up和def更改之间的差异

时间:2013-07-06 22:52:53

标签: ruby-on-rails database sqlite migration

def up; enddef change; end之间有什么区别? 我有代码

class CreateTweets < ActiveRecord::Migration
  def change
    create_table :tweets do |t|
      t.string :status
      t.integer :zombie_id

      t.timestamps
    end
  end
end

如果我定义def up而不是def change,会有什么变化?

1 个答案:

答案 0 :(得分:13)

up方法应附带down方法,可用于撤消迁移的更改。例如,如果您使用向上和向下编写问题中的示例,则需要以下代码:

class CreateTweets < ActiveRecord::Migration
  def up
    create_table :tweets do |t|
      t.string :status
      t.integer :zombie_id

      t.timestamps
    end
  end

  def down
    drop_table :tweets
  end
end

另一方面,change方法可以由Rails自动反转,因此无需手动创建down方法。

引入了

change来替换updown,因为大多数down方法可以根据up方法轻松预测(在上面的示例中为{ {1}}显然与drop_table)相反。

如果无法自动导出反向操作,您可以使用create_tableup方法,也可以调用down中的reversible方法方法

有关详细信息,请参阅sections 3.6 - 3.7 of the Rails migration guide