belongs_to和has_one有什么区别?
belongs_to
和has_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 A
与class B
有一个has_one
关系,那么class A
是class B
的父class B
因此你的class B
与class 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_one
和belongs_to
在某种意义上大体相同,即指向其他相关模型。 belongs_to
确保此模型具有foreign_key
定义。 has_one
确保其他模型has_foreign
键定义。
具体而言, relationship
有两个方面,一个是Owner
,另一个是Belongings
。 如果只有has_one
被定义,我们可以得到它的belongings
但不能从belongings
获得Owner
。 为了追踪Owner
我们需要在所属模型中定义belongs_to
。