我理解关系数据库、主键/外键等的概念,但我很难在模型中看到设置这些属性的实际结果。它们是否生成辅助函数或类似的函数?还是它们只是在数据库级别上工作?
例如,如果我有这两个模型(其他属性省略)
class Course < ActiveRecord::Base
has_and_belongs_to_many :schedules
has_many :sections
end
class Section < ActiveRecord::Base
belongs_to :course
end
我可以简单地获得任何给定课程的所有部分,比如:
Section.where(course_id: 1234)
然而,我完全可以在没有建立关系的情况下做到这一点。所以我的问题是:我们为什么要这样做?
添加这些方法可以完成以下操作:
Section.find(5).course # <== returns a 'Course' model instance
此外,它还可以让您更容易地加入查询:
Section.joins(:course).where(course: {name: "English"}) # <== returns sections who have the 'english' course
如果不在模型中设置关系,这两者都不可能实现。
类似:
Course.find(8).sections # returns an array of sections with 'course_id = 8'
它使您的调用更加语义化,并从编程的角度使事情变得更容易:)
关系应用于对象的实例。因此,这些关系允许您将相关对象获取到另一个实例。
例如,假设您有一个Section
(称为@section
)的实例。您可以通过以下操作获得该部分的所有Course
对象:
如果已设置belongs_to :course
,则为@section.course
。
类似地,如果您有一个Course
的实例,您可以使用获取该Course
的所有Section
对象
如果您有has_many :sections
,则为@course.sections
。
TL;DR-这些是辅助作用域,例如Course
和Section
的变量。