例如,在
中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
作为一个学生对象作为奖项的接受者,所以工作方式与方法相同帖子的顶部?
答案 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_many
和belongs_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_to
而Award
会获得has_one
。
希望说清楚?
一个学生可以属于&#39;这似乎有点奇怪。如果您使用自然语言奖励。但这就是如何编写rails活动记录域特定语言。
当你看到很多很多人的声音时会发出更加不自然的声音。与&#39; has_many_and_belongs_to&#39;的关系。这里有一个连接表,在主表之间有一个站点,如
students_awards
student_id
award_id
在这种情况下,Students
和Awards
表都没有外键,但两者都带有has_many_and_belongs_to :other_table
声明。两个表都能够连接到另一个表的多个行。每个Student
可以有多个Award
。每个Award
都可以应用于多个Students
。
has_one
声明仅用于有一对一的&#39;关系及其适用的表不是否具有外键。