这两个例子是不等价的。
has_many
并belongs_to
在存在“多对一”关系的情况下成对工作。
在数据库中,这看起来像:
**Students**
Name
Email
...
**Awards**
Name
student_id <-- !IMPORTANT!
...
每个Student
人都有许多奖项因此has_many :awards
每个人都Award
“属于”一个Student
因此belongs_to :student
请注意, 将belongs_to
应用于具有外键的表student_id
。这个很重要。
好的——那么在存在“一对一”关系的情况下会发生什么?
如果每个学生只能获得一个奖项,那么数据库表可能看起来完全相同,但模型不应该能够返回项目集合。
这就是我们需要has_one
声明的地方。在这种情况下,这将应用于Student
模型。为什么?因为关系在两个方向上是相同的,但 Active Record 需要知道在哪里可以找到外键。
如果数据库表是相反的,每个表Student
都有一个,award_id
那么Student
将获得belongs_to
并且Award
将获得has_one
.
希望清楚吗?
如果你使用自然语言,一个学生可能“属于”一个奖项,这似乎有点奇怪。但这就是 Rails 活动记录域特定语言的编写方式。
当您查看与“has_many_and_belongs_to”的“多对多”关系时,听起来会更加不自然。这里有一个连接表,您的主表之间的站点像
students_awards
student_id
award_id
在这种情况下,无论是表Students
还是Awards
表都没有外键,但两者都会携带has_many_and_belongs_to :other_table
声明。两个表都能够连接到另一个表的多行。每个都Student
可以有多个Award
。每个Award
都可以应用于许多Students
.
该has_one
声明仅在存在“一对一”关系并且它适用的表没有外键的情况下使用。