在迁移文件中,为什么"down"部分的方法必须与"up"的顺序相反?

In migration files, why do the methods in the "down" part have to be in reverse order from "up"?

使用 Rails 5.0。它在 Rails 指南以及我的教程中说 down 中的方法应该与 up 中的方法相反。 例如:

class AlterUsers < ActiveRecord::Migration[5.0]
  def up
    rename_table("users", "admin_users")
    add_column("admin_users", "username", :string, :limit =>25, :after => "email")
    change_column("admin_users", "email", :string, :limit => 100)
  end

  def down
    change_column("admin_users", "email", :string, :default => '', :null => false)
    remove_column("admin_users", "username")
    rename_table("admin_users", "users")
  end
end

注意:down 中的方法与在 up 中执行的顺序相反。即:由于 change_column 最后从 up 执行,第一个在 down 执行。

我知道 down 必须撤消 up 所做的一切,以便您将数据库恢复到以前的状态。我只是想知道是否有任何特殊原因导致 down 中的方法必须按照它们在 up 中执行的顺序相反的顺序执行?

Should 是这里要重点关注的词,因为并不总是需要它,但养成做的习惯是很好的做法。实际上,仅当过程包含彼此有些相关的迁移时才有必要。

举一个执行顺序无关紧要的迁移示例:

class AlterUsers < ActiveRecord::Migration[5.0]
  def up
    add_column "users", "first_name", :string
    add_column "users", "last_name", :string
  end

  def down
    remove_column "users", "first_name"
    remove_column "users", "last_name"
  end
end

在上面的例子中,这两个变化完全不会相互影响,即使我没有颠倒顺序,也不会造成任何问题。

但是查看您问题中的示例,重命名您稍后添加列的 table 是非常相关的更改。因此,如果您不反转 down 方法中的顺序,那么它将首先将 table 从 "admin_users" 重命名为 "users",然后尝试从中删除一列"admin_users" table 不再存在,这将导致迁移失败。这当然可以通过调整对 remove_column 的调用以将其从 "users" table 中删除来轻松解决,但是一旦你去了那里,迁移就会变得非常混乱。

TL;DR:

它并不总是需要的,但如果你总是这样做,你就不太可能 运行 因为迁移冲突而陷入问题。