t.模型中迁移vs belongs_to的参考?

Dra*_* C. 25 activerecord ruby-on-rails

我正在阅读Rails指南,我找到了以下代码行:

  class CreateComments < ActiveRecord::Migration
     def change
       create_table :comments do |t|
          t.string :commenter
          t.text :body
          t.references :post

          t.timestamps
       end

       add_index :comments, :post_id
     end
 end
Run Code Online (Sandbox Code Playgroud)

我还阅读了Michael Hartl的书,Rails Tutorial,我没有找到任何关于上面代码中使用的"t.references"的内容.它有什么作用?在Michael的书中,我在模型中使用了has_many和belongs_to关系,而在迁移中没有使用任何关系(不是事件t.belongs_to).

Tim*_*van 29

这是Rails最近的一个新增功能,因此您提及的书中可能没有涉及到它.您可以在Rails指南的迁移部分中阅读它.

当你使用生成时,比方说

rails generate model Thing name post:references
Run Code Online (Sandbox Code Playgroud)

...迁移将为您创建外键字段,以及创建索引.这是什么t.references.

你可以写

rails generate model Thing name post_id:integer:index
Run Code Online (Sandbox Code Playgroud)

得到了相同的最终结果.

  • 顺便说一下,你实际上可以在迁移中使用`belongs_to` - 它是`references`的别名 (4认同)
  • 不,这本书自添加此功能以来已经更新,但迈克尔认为参考文章太多魔术,并分别教授每个元素.我个人认为,一旦基本概念被教授,至少不要提到这个快捷方式是错误的,因为数据库关系是构建几乎任何Rails应用程序的核心,所以它是反复做的事情. (3认同)
  • 这是为模型添加外键,而不是底层数据库.无论如何你还需要这样做.但是,如果使用`post:references`生成模型,生成器将自动为您添加`belongs_to:post`. (2认同)

cor*_*tex 7

请参阅Rails指南的这一部分.

在您的情况下,在表中t.references创建一个post_idcomments.这意味着Comment属于Post,因此在Comment模型中你必须添加belongs_to :post并在Post模型中:has_many :comments.