在Rails中,关键字belongs_to,has_many等实际上做了什么?

时间:2013-12-05 23:45:35

标签: ruby-on-rails ruby database-relations

我理解关系数据库,主键/外键等的概念,但是,我在查看在模型中设置这些属性的实际结果时遇到了麻烦。他们是否生成辅助函数或类似的东西?或者他们只是在数据库级别上工作?

例如,如果我有这两个模型(省略其他属性)

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)

但是,我可以在没有建立关系的情况下做到这一点。 所以我的问题是:为什么我们这样做?

2 个答案:

答案 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 - 这些是CourseSection的实例变量的辅助范围