我理解关系数据库,主键/外键等的概念,但是,我在查看在模型中设置这些属性的实际结果时遇到了麻烦。他们是否生成辅助函数或类似的东西?或者他们只是在数据库级别上工作?
例如,如果我有这两个模型(省略其他属性)
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)
但是,我可以在没有建立关系的情况下做到这一点。 所以我的问题是:为什么我们这样做?
答案 0 :(得分:3)
添加这些方法让你做这样的事情:
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'
它使您的调用更具语义性,并从程序化角度使事情变得更容易:)
答案 1 :(得分:2)
关系应用于对象的实例。因此,这些关系允许您将相关对象获取到另一个实例。
例如,假设您有Section
的实例(称为@section
)。您可以通过执行以下操作获取该部分的所有Course
个对象:
@section.course
,则 belongs_to :course
。
同样,如果您有Course
的实例,则可以使用以下内容获取Section
的所有Course
个对象:
@course.sections
,请 has_many :sections
。
TL; DR - 这些是Course
和Section
的实例变量的辅助范围。