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

Fil*_*uzi 6 database migration sqlite ruby-on-rails

def up; end和之间有什么区别def 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
Run Code Online (Sandbox Code Playgroud)

如果我定义def up而不是改变它会改变什么def change

geo*_*ock 14

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
Run Code Online (Sandbox Code Playgroud)

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

change引入替换up,down因为大多数down方法可以很容易地根据up方法预测(在上面的例子drop_table显然是相反的create_table).

在无法自动派生反向操作的情况下,您可以使用updown方法,也可以reversiblechange方法中调用方法.

有关详细信息,请参阅Rails迁移指南第3.6 - 3.7节.