2010-09-28 68 views
103

belongs_tohas_one有什么区别?belongs_to和has_one有什么区别?

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

+3

[有\ _one和属于\ _to在Rails中的区别?]的可能的重复项(http://stackoverflow.com/questions/861144/difference-between-has-one-and-belongs -to-in-rails) – Nakilon 2014-11-10 14:48:02

回答

161

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

here是一个更详细的解释。

+0

ok有道理,has_a是属性,而属于更多的是关系。 – Blankman 2010-09-28 01:48:15

+8

好博客[在此](http://requiremind.com/differences-between-has-one-and-belongs-to-in-ruby-on-rails/)。 – 2013-11-17 10:03:00

+20

所以说它真的很短: '产品belongs_to商店'的意思是'产品'表具有'shop_id'列 – 2014-09-24 12:31:58

31

这是关于外键坐落的位置。

class Foo < AR:Base 
end 
  • 如果富belongs_to :bar,那么FOOS表有一个bar_id
  • 如果富has_one :bar,那么酒吧表有一个foo_id

在概念层面上,如果你的class Aclass B有关系has_one,则class Aclass B的母公司,因此您的class B将与class Abelongs_to关系,因为它是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) 
) 
+0

这是几乎相同的两年前已接受的答案已经说明。 – 2012-10-05 18:26:52

+7

这几乎是一个更好的答案。 – typeoneerror 2015-07-10 02:42:35

3

has_onebelongs_to一般都是在一定意义上同它们指向其他相关模型。 belongs_to确保此型号已定义foreign_keyhas_one确保其他型号has_foreign的键已定义。

更具体地说,有两个边relationship,一个是Owner,其他的是Belongings。如果只定义了has_one,我们可以得到它的Belongings,但不能从belongings得到Owner。要追踪Owner,我们还需要在所属模型中定义belongs_to

0

,我想补充的是,假设我们一个额外的事情有如下型号协会

class Author < ApplicationRecord has_many :books end

如果我们只写了上述关联那么我们就可以通过,

获得某个作者的所有书籍
@books = @author.books 

但对于特定的书,我们无法获得通过相应的作者,

@author = @book.author 

,使上面的代码工作的工作,我们需要的关联添加到Book模型也,这样

class Book < ApplicationRecord 
    belongs_to :author 
end 

这方法“作者”添加到Book模型。
有关模式的详细信息,请参阅guides