Rails模型与迁移过程有什么关系?

时间:2017-05-25 16:54:25

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

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

  

因为您的第一次迁移“create_posts”是必要的   你已经在Post中定义了可翻译的属性:title和:text   模型,但你删除了:帖子模型翻译的标题。

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

1 个答案:

答案 0 :(得分:1)

  

但是为什么有必要让#34;定义可翻译属性:标题和:文章在Post模型中#34;?如果您只是在运行迁移,那么这与模型文件有什么关系呢?

首先,迁移文件只是一个ruby文件。你可以在里面写任何代码

迁移文件中的代码类型:

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

    • 这些与您的模型无关,这意味着这些不关心您的模型。尝试删除您的模型文件,然后使用create_table运行rake db:migrate迁移文件,您会发现它成功而没有错误。
  2. 有时,它们强烈耦合/依赖于当前模型文件的内容(或者实际上可能依赖于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迁移方法,我们无法确定该代码是否依赖于& #34;东西&#34;从您当前的代码。我可以假设上面的命令就是这样,因为文章说

        

      你会得到大错误!

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

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

      • 虽然......我实际上可能会更新&#34; BROKEN&#34;迁移文件只是为了使rake db:migrate正常运行,前提是我确定迁移错误是从非Rails方法的行跟踪的,这些方法取决于我的代码的特定版本。