在Rails中,使用“has_many with belongs_to”vs“has_many with has_one”有什么区别?

时间:2010-09-15 02:45:51

标签: ruby-on-rails activerecord belongs-to has-one

例如,在

class Student < ActiveRecord::Base
  has_many :awards
end

class Awards < ActiveRecord::Base
  belongs_to :student
end

以上应该是正确的用法,但如果我们使用

怎么办?
class Student < ActiveRecord::Base
  has_many :awards
end

class Awards < ActiveRecord::Base
  has_one :student
end

上面的内容也不能使student.awards成为一个Award对象数组,award.student作为一个学生对象作为奖项的接受者,所以工作方式与方法相同帖子的顶部?

2 个答案:

答案 0 :(得分:7)

has_one用于一对一关系,而非一对多关系。

正确使用has_one

class Student < ActiveRecord::Base
  has_one :id_card
end

class IdCard < ActiveRecord::Base
  belongs_to :student
end

答案 1 :(得分:1)

这两个例子并不相同。

has_manybelongs_to配对,其中有多对一的&#39;关系。

在数据库中,这将是:

**Students**
Name
Email
...

**Awards**
Name
student_id  <-- !IMPORTANT!
...

每个Student都有很多奖项has_many :awards 每个Award&#39;属于&#39;一个Student因此belongs_to :student

请注意,belongs_to已应用于具有外键student_id的表。这很重要。

好的 - 那么在有一对一的情况下会发生什么?关系?

如果每个学生只能获得一个奖励,那么数据库表看起来可能完全相同,但模型不应该返回一组项目。

这是我们需要has_one声明的地方。在这种情况下,这将适用于Student模型。为什么?因为两个方向的关系相同,但Active Record需要知道在哪里找到外键。

如果数据库表是相反的,每个Student都有award_id,那么Student会获得belongs_toAward会获得has_one

希望说清楚?

一个学生可以属于&#39;这似乎有点奇怪。如果您使用自然语言奖励。但这就是如何编写rails活动记录域特定语言。

当你看到很多很多人的声音时会发出更加不自然的声音。与&#39; has_many_and_belongs_to&#39;的关系。这里有一个连接表,在主表之间有一个站点,如

students_awards
student_id
award_id

在这种情况下,StudentsAwards表都没有外键,但两者都带有has_many_and_belongs_to :other_table声明。两个表都能够连接到另一个表的多个行。每个Student可以有多个Award。每个Award都可以应用于多个Students

has_one声明用于有一对一的&#39;关系及其适用的表是否具有外键。