2017-05-25 46 views
0

在这article,我不明白是什么问题,如果您运行rake db:migrate而不是rake db:schema:load。作者说,这是Rails模型与迁移过程有什么关系?

,因为你的第一个移民“create_posts”这是必要的 您已经定义了翻译的属性:从Post模型的翻译标题:标题和:后 示范文本,但你删除。

但是为什么您需要“在Post模型中定义可翻译的属性:标题和:文本”?如果您只是在运行迁移,那么这与您的模型文件有什么关系?迁移和数据库不检查您的模型文件的任何事情吗?运行rake db:migrate只是简单地通过只看您的迁移和翻译内部的这些rails方法到SQL命令为您建立一个新的数据库,然后为您生成一个新的schema.rb文件对吗?为什么它关系到你模型中的内容?

回答

1

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

首先,迁移文件只是一个红宝石文件。你可以写任何代码里面它:

代码的类型在迁移文件:

  1. 平时他们迁移方法create_tableadd_column

    • 这些是你的模型的不可知论,这意味着这些不关心你的模型。尝试删除您的模型文件,然后使用rake db:migrate运行create_table迁移文件,您会注意到它成功无误。
  2. 有时,它们被强耦合/依赖于当前的模型文件的内容(或者可以实际上取决于aaaany代码)。这些是而不是默认的Rails迁移方法,并且通常是您的一个或多个宝石甚至您自己的代码实现(如果有的话)的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!以上,我认为是从的方法全球化宝石,因为它不是一个Rails迁移方法,如果代码依赖于当前代码中的“某些内容”,我们无法确定。我可以假设上面的命令就是这样,因为文章说

      你会得到大错误!

    • 这就是为什么文章说,从一个全新的数据库迁移时使用rake db:schema:load而非rake db:migrate

      • 因为rake db:migrate运行WHATEVER内的每个迁移文件的所有代码
      • rake db:schema:load只运行一个文件,它是schema.rb,它只是普通的数据库信息,并没有可能干扰/引发错误的外部代码。

      • 尽管...我可能实际上更新了“BROKEN”迁移文件,以便rake db:migrate可以正常运行,前提是我确定迁移错误是从非Rails方法我的代码的特定版本。

+0

所以你说,在全球化的宝石很可能会参考模型文件,所以运行结构,它只是更安全:负荷? – stackjlei

+0

最有可能的是。然而,为了确保,我阅读了全球化的gem自述文件,并且确切地发现'.create_translation_table!'方法取决于模型代码(参见[here](https://github.com/globalize/globalize#creating-我引用:“另请注意,在创建翻译表之前,必须通过模型中的翻译来定义翻译后的属性,如上所示。” –

+1

只有当您还有另一个迁移文件时:“从posts_translations表中删除:标题”,并且在从邮件中删除':title'时立即运行此迁移文件,它将会更“安全”模型。请参阅[文档中的dir.down](https://github.com/globalize/globalize#adding-additional-fields-to-the-translation-table),了解如何创建迁移文件,以便删除可翻译的属性。这很重要,因为在你运行这个迁移文件之后,它会更新你的'schema.rb',这样'post_translations'表就不会再... –