【问题标题】:In migration files, why do the methods in the "down" part have to be in reverse order from "up"?在迁移文件中,为什么“向下”部分中的方法必须与“向上”相反?
【发布时间】:2016-12-23 01:08:43
【问题描述】:

使用 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 中的执行顺序相反,是否有任何特殊原因?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5 rails-migrations


    【解决方案1】:

    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
    

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

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

    TL;DR:

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

    【讨论】:

    • 哇谢谢你说得这么有道理,从现在开始会这样做:)
    猜你喜欢
    • 2022-06-28
    • 2019-09-30
    • 2020-07-05
    • 1970-01-01
    • 2012-11-29
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    相关资源
    最近更新 更多