Rails中has_one和belongs_to之间的区别?

Moo*_*oon 69 ruby ruby-on-rails has-one

我想了解has_oneRoR中的关系.

假设我有两个模型 - Person并且Cell:

class Person < ActiveRecord::Base
  has_one :cell
end

class Cell < ActiveRecord::Base
  belongs_to :person
end
Run Code Online (Sandbox Code Playgroud)

我可以只使用has_one :person,而不是belongs_to :personCell模型?

不一样吗?

Sar*_*Mei 159

不,它们不可互换,并且存在一些真正的差异.

belongs_to表示外键位于此类的表中.所以belongs_to只能进入持有外键的类.

has_one表示在另一个引用此类的表中有一个外键.因此has_one,只能进入另一个表中的列引用的类.

所以这是错的:

class Person < ActiveRecord::Base
  has_one :cell # the cell table has a person_id
end

class Cell < ActiveRecord::Base
  has_one :person # the person table has a cell_id
end
Run Code Online (Sandbox Code Playgroud)

这也是错误的:

class Person < ActiveRecord::Base
  belongs_to :cell # the person table has a cell_id
end

class Cell < ActiveRecord::Base
  belongs_to :person # the cell table has a person_id
end
Run Code Online (Sandbox Code Playgroud)

正确的方法是(如果Cell包含person_id字段):

class Person < ActiveRecord::Base
  has_one :cell # the person table does not have 'joining' info
end

class Cell < ActiveRecord::Base
  belongs_to :person # the cell table has a person_id
end
Run Code Online (Sandbox Code Playgroud)

对于双向关联,您需要其中一个,并且必须进入正确的类.即使对于单向关联,您使用哪一个也很重要.

  • 我总是从玩具总动员的角度来考虑它.安迪'has_one'伍迪,伍迪'属于'安迪'.外键在哪里?在伍迪的唯一. (96认同)
  • 太好了,现在我知道两个错误的答案.最好是展示"正确"的方式来展示它.只是在说'. (20认同)
  • 这是一个很酷的助记符,但我想我会分享我记忆中的数学方法.has_one类似于has_many,has_many意味着密钥在另一个表上,因为SQL表上定义了固定数量的列. (10认同)
  • 我不得不看了十亿次.我希望他们能够更好地考虑命名,以便更清楚哪一个去哪里. (6认同)

Pab*_*dez 12

如果添加"belongs_to",那么您将获得双向关联.这意味着您可以从单元格中获取一个人,从该人那里获取一个单元格.

没有真正的区别,两种方法(使用和不使用"belongs_to")都使用相同的数据库模式(单元数据库表中的person_id字段).

总结:除非您需要模型之间的双向关联,否则不要添加"belongs_to".

  • 我今天读到的最好的一句话:“如果你添加“belongs_to”,那么你就得到了一个双向关联。这意味着你可以从单元格中获取一个人,从这个人中获取一个单元格。+1 (4认同)

小智 7

使用两者都可以从Person和Cell模型中获取信息.

@cell.person.whatever_info and @person.cell.whatever_info.
Run Code Online (Sandbox Code Playgroud)