belongs_to和has_one有什么区别?

belongs_tohas_one什么区别?

阅读Ruby on Rails指南并没有帮助我。

他们基本上做同样的事情,唯一的区别就是你所处的关系的哪一方面。 如果一个User有一个Profile ,那么在User类中你会有has_one :profile而在Profile类中你将拥有belongs_to :user 。 要确定谁拥有另一个对象,请查看外键的位置。 我们可以说User “有”一个Profile因为profiles表有一个user_id列。 如果users表中有一个名为profile_id的列,我们可以说一个Profile有一个User ,并且belongs_to / has_one位置将被交换。

这里是一个更详细的解释。

这是关于外键在哪里。

 class Foo < AR:Base end 
  • 如果foo belongs_to :bar ,那么foos表有一个bar_id
  • 如果foo has_one :bar ,那么bars表有一个foo_id

在概念层面上,如果你的class Aclass B有一个has_one关系,那么class Aclass B的父class B因此你的class Bclass A有一个belongs_to关系,因为它是class A的子class A

两者都expression了1-1的关系。 差异主要在于放置外键的位置,该外键位于声明belongs_to关系的类的表格中。

 class User < ActiveRecord::Base # I reference an account. belongs_to :account end class Account < ActiveRecord::Base # One user references me. has_one :user end 

这些类的表格可能如下所示:

 CREATE TABLE users ( id int(11) NOT NULL auto_increment, account_id int(11) default NULL, name varchar default NULL, PRIMARY KEY (id) ) CREATE TABLE accounts ( id int(11) NOT NULL auto_increment, name varchar default NULL, PRIMARY KEY (id) ) 

has_onebelongs_to在某种意义上大体相同,即指向其他相关模型。 belongs_to确保此模型具有foreign_key定义。 has_one确保其他模型has_foreign键定义。

具体而言, relationship有两个方面,一个是Owner ,另一个是Belongings 。 如果只有has_one被定义,我们可以得到它的belongings但不能从belongings获得Owner 。 为了追踪Owner我们需要在所属模型中定义belongs_to