在迁移文件中,为什么"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:
它并不总是需要的,但如果你总是这样做,你就不太可能 运行 因为迁移冲突而陷入问题。
使用 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:
它并不总是需要的,但如果你总是这样做,你就不太可能 运行 因为迁移冲突而陷入问题。