使用user生成模型:references vs user_id:integer

时间:2011-10-22 19:11:47

标签: ruby-on-rails

我对如何生成属于另一个模型的模型感到困惑。我的书使用这种语法将Micropost与User:

相关联
rails generate model Micropost user_id:integer

http://guides.rubyonrails.org/说是这样做的:

rails generate model Micropost user:references

这些2生成的迁移是不同的。另外,对于前者,rails如何知道user_id是引用user的外键?谢谢!

2 个答案:

答案 0 :(得分:180)

运行迁移时,两者都会生成相同的列。在rails控制台中,您可以看到这种情况:

:001 > Micropost
=> Micropost(id: integer, user_id: integer, created_at: datetime, updated_at: datetime)

第二个命令在Micropost模型中添加belongs_to :user关系,而第一个命令则不在。指定此关系后,ActiveRecord将假定外键保留在user_id列中,并且它将使用名为User的模型来实例化特定用户。

第二个命令还在新user_id列上添加索引。

答案 1 :(得分:15)

对于前者,约定优于配置。当您使用

引用另一个表时,Rails默认
 belongs_to :something

是寻找something_id

references,或者belongs_to实际上是用较少的怪癖编写前者的新方式。

重要的是要记住它不会为您创建外键。为此,您需要使用以下任一方式明确设置:

t.references :something, foreign_key: true
t.belongs_to :something_else, foreign_key: true

或(注意复数):

add_foreign_key :table_name, :somethings
add_foreign_key :table_name, :something_elses`