【问题标题】:What do Rails models have to do with the process of migrations?Rails 模型与迁移过程有什么关系?
【发布时间】:2017-10-26 10:07:01
【问题描述】:

在这个article 中,如果你运行rake db:migrate 而不是rake db:schema:load,我不明白有什么问题。作者说是

因为对于您的第一次迁移“create_posts”,有必要 您在 Post 中定义了可翻译属性 :title 和 :text 模型,但您从发布模型翻译中删除了 :title。

但是为什么你需要“在 Post 模型中定义可翻译属性 :title 和 :text”?如果您只是在运行迁移,那与您的模型文件有什么关系?迁移和数据库不会检查您的模型文件是否有任何内容?运行rake db:migrate 只是简单地查看您的迁移并将这些rails 方法转换为SQL 命令为您构建一个新的数据库,然后为您生成一个新的schema.rb 文件,对吗?为什么模型中的内容很重要?

【问题讨论】:

    标签: ruby-on-rails migration schema rake database-schema


    【解决方案1】:

    但是为什么你需要“在 Post 模型中定义可翻译属性 :title 和 :text”?如果您只是在运行迁移,那与您的模型文件有什么关系?

    首先,迁移文件只是一个 ruby​​ 文件。您可以在其中编写任何代码

    迁移文件中的代码类型:

    1. 通常它们是迁移方法,例如create_tableadd_column

      • 这些与您的模型无关,这意味着它们不关心您的模型。尝试删除您的模型文件,然后使用rake db:migrate 运行您的create_table 迁移文件,您会发现它成功且没有错误。
    2. 有时,它们与您当前 model 文件的内容强耦合/依赖(或者实际上可能依赖于 aaaany 代码)。这些不是默认的 Rails 迁移方法,通常是您的一个或多个 gems 甚至您自己的代码实现(如果有)的 API 方法。在您的示例中,查看article,我注意到了一种非Rails 迁移方法:

      class CreatePosts < ActiveRecord::Migration
        def up
          create_table :posts do |t|
            t.timestamps
          end
      
          # this is not a Rails migration method
          Post.create_translation_table! title: :string, text: :text
        end
      end
      
      • 对于上面的Post.creation_translation_table!,我假设它是来自 globalize gem 的方法,因为它不是 Rails 迁移方法,我们无法确定该代码是否依赖于您当前的“某些东西”代码。我可以假设上面的命令就是这样,因为文章说

        你会得到很大的错误!

      • 这就是为什么文章说从新数据库迁移时使用rake db:schema:load 而不是rake db:migrate

        • 因为rake db:migrate 运行WHATEVER每个迁移文件中的所有代码
        • 虽然rake db:schema:load 只运行一个文件,但schema.rb 只是简单的数据库信息,没有可能破坏/引发错误的外来代码。

        • 虽然...我实际上可能会更新“BROKEN”迁移文件,以便rake db:migrate 可以正常运行,前提是我确定迁移错误是从非 Rails 方法的行中跟踪的依赖于我的代码的特定版本。

    【讨论】:

    • 所以你是说 globalize gem 可能会引用模型文件,所以运行 structure:load 更安全?
    • 很可能是的。然而,为了确定,我通读了 globalize gem 自述文件,发现.create_translation_table! 方法完全依赖于模型代码(参见here),我引用:“还要注意,在创建转换表之前,如上所示,您必须通过模型中的翻译来定义翻译后的属性。”
    • 只有当您还有另一个迁移文件:“从 posts_translations 表中删除 :title”并且您在您运行此迁移文件时也立即运行此迁移文件时,它才会“更安全”从 Post 模型中删除 :title。请参阅dir.down from the docs 以了解如何创建可删除可翻译属性的迁移文件。这很重要,因为在您运行此迁移文件后,它会更新您的 schema.rb 以便 post_translations 表将不再...
    • ... 有:title 列,并记住... schema.rbrake db:schema:load 刚刚运行的内容。这意味着,如果您没有此删除迁移文件,您的 schema.rb 将不同步,因此当您创建一个全新的数据库并运行 rake db:schema:load 时,该数据库将不同步,但是是的,它会起作用(至少现在,前提是您以后不会再添加 :title,因为这会破坏未来的迁移运行)。
    猜你喜欢
    • 2013-10-24
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2012-12-18
    • 2021-01-18
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    相关资源
    最近更新 更多