属于某人和拥有某人有什么区别?

belongs_tohas_one的区别是什么?

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

74816 次浏览

他们基本上做同样的事情,唯一的区别是你站在关系的哪一边。如果一个 User有一个 Profile,那么在 User类中你会有 has_one :profile,在 Profile类中你会有 belongs_to :user。要确定谁“拥有”另一个对象,请查看外键的位置。我们可以说 User“有”一个 Profile,因为 profiles表有一个 user_id列。但是,如果在 Profile1表上有一个名为 Profile0的列,我们就会说 Profile有一个 User,属于/has _ one 的位置将被交换。

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

是关于外国钥匙的位置。

class Foo < AR:Base
end
  • 如果 foo belongs_to :bar,则 fos 表有一个 bar_id
  • 如果 foo has_one :bar,则条形表有一个 foo_id

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

两者都表现出一对一的关系。区别主要在于将外键放在哪里,外键放在声明 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通常在某种意义上是相同的,它们指向其他相关的模型。确保这个模型定义了 foreign_keyhas_one确保定义了另一个模型 has_foreign键。

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

我还想补充的一点是,假设我们有以下模型关联。

class Author < ApplicationRecord
has_many :books
end

如果我们只写上面的关联,那么我们可以得到一个特定作者的所有书籍

@books = @author.books

但是,对于一本特定的书,我们找不到相应的作者

@author = @book.author

为了使上面的代码工作,我们还需要向 Book模型添加一个关联,如下所示

class Book < ApplicationRecord
belongs_to :author
end

这将为 Book模型添加方法“ author”

从简单的角度来看,belongs_to优于 has_one,因为在 has_one中,您必须向具有外键的模型和表添加以下约束,以强制 has_one关系:

  • validates :foreign_key, presence: true, uniqueness: true
  • 在外键上添加数据库唯一索引。

has_one

  • 只有在 other class包含 foreign key时才应该使用此方法。

belongs_to

  • 只有在 current class包含 foreign key时才应该使用此方法。