Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在迁移文件中,为什么在;“向下”;零件的顺序必须与“相反”;向上;?_Ruby On Rails_Ruby On Rails 5_Rails Migrations - Fatal编程技术网

Ruby on rails 在迁移文件中,为什么在;“向下”;零件的顺序必须与“相反”;向上;?

Ruby on rails 在迁移文件中,为什么在;“向下”;零件的顺序必须与“相反”;向上;?,ruby-on-rails,ruby-on-rails-5,rails-migrations,Ruby On Rails,Ruby On Rails 5,Rails Migrations,使用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") ch

使用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
class-AlterUsers25、:之后=>“电子邮件”)
更改列(“管理员用户”、“电子邮件”、:字符串、:限制=>100)
结束
降下
更改列(“管理员用户”、“电子邮件”、“字符串”、“默认值=>”、:空=>false)
删除列(“管理员用户”、“用户名”)
重命名表格(“管理员用户”、“用户”)
结束
结束
注意:
down
中的方法与在
up
中执行的顺序相反。i、 e:由于
change\u列
是从
向上
执行的最后一列,因此是在
向下
执行的第一列


我知道
down
必须撤消
up
所做的一切,以便将数据库恢复到以前的状态。我只是想知道为什么
down
中的方法必须按照与
up
相反的顺序执行,是否有什么特别的原因?

应该
是这里要重点关注的词,因为它并不总是需要的,但养成这样做的习惯是一种很好的做法。在实践中,只有当过程包含彼此有一定关联的迁移时,才有必要这样做

要给出执行顺序无关紧要的迁移示例,请执行以下操作:

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
class-AlterUsers
在上面的示例中,这两个更改根本不会相互影响,即使我没有颠倒顺序,也不会导致任何问题

但是看一下问题中的示例,重命名稍后添加列的表与更改非常相关。因此,如果您不想颠倒
down
方法中的顺序,那么它将首先将表从
的“admin\u users”
重命名回
的“users”
,然后尝试从
的“admin\u users”
表中删除一个不再存在的列,这将导致迁移失败。当然,通过调整对
remove\u列的调用,将其从
“users”
表中删除,可以很容易地解决这个问题,但是一旦您转到那里,迁移就会变得非常混乱

TL;博士:


它并不总是需要的,但如果您总是这样做,您就不太可能因为迁移冲突而遇到问题。

Wow感谢您这么有意义,我们将从现在开始这样做:)