Answers:
他们本质上是做相同的事情,唯一的区别是您在关系的哪一边。如果a User
有一个Profile
,则在User
班级has_one :profile
和Profile
班级都有belongs_to :user
。要确定谁“拥有”另一个对象,请查看外键在哪里。我们可以说User
“有” a是Profile
因为profiles
表中有一user_id
列。但是,如果profile_id
在users
表上有一列被调用,我们可以说a Profile
具有一个User
,并且bewhens_to / has_one位置将被交换。
这是更详细的说明。
Product belongs_to Shop
手段products
表有shop_id
列
关于外键的位置。
class Foo < AR:Base
end
belongs_to :bar
,则foos表中有一bar_id
列has_one :bar
,则bars表中有一foo_id
列从概念上讲,如果您class A
与has_one
关联,class B
则class A
是的父级,class B
因此您class B
将与belongs_to
关联,class A
因为它是的子级class A
。
两者都表示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)
)
Account
User
在此示例中和是很不幸的,因为一个帐户通常可以有许多用户。
我要添加的另一件事是,假设我们具有以下模型关联
class Author < ApplicationRecord
has_many :books
end
如果我们只写上述关联,那么我们可以通过以下方式获得特定作者的所有书籍:
@books = @author.books
但是对于一本书,我们无法找到相应的作者,
@author = @book.author
为了使上述代码正常工作,我们还需要向Book模型添加关联,就像这样
class Book < ApplicationRecord
belongs_to :author
end
这会将方法“作者”添加到Book模型中。
有关模式的详细信息,请参见指南