使用ActiveRecord使用多个关系编写查询

时间:2017-10-22 17:33:45

标签: ruby-on-rails activerecord

鉴于下面列出的关系,我正在尝试编写一个活动记录查询,该查询将返回给定student_id的Sections列表,如:

  def self.student_courses(student_id)
    Section
        .where(enrollment: Enrollment
        .where(student: Student.find_by(student_id: student_id)))
  end

但这会引发错误:SQLException: no such column: sections.enrollment:

据我所知,Sections中没有该列的列。我该如何编写查询以返回给定学生的Sections?列表?

csv

栏目

class Section < ApplicationRecord
  has_many :enrollments
  has_many :students, through: :enrollments
  belongs_to :course

注册

class Enrollment < ApplicationRecord
  belongs_to :section
  belongs_to :student
end

学生

class Student < ApplicationRecord
  has_many :enrollments
  has_many :sections, through: :enrollments
end

1 个答案:

答案 0 :(得分:1)

不要在Rails中为主键列添加前缀。只需将它们命名为id - 这就是Rails的惯例 - 而且我会说,通常前缀是一个超级丰富的解决方案,可以解决使用含糊不清的标识符编写蹩脚SQL的问题。

Rails是关于约定优于配置的,并且使用非传统列名称将要求您在所有关联中指定主键列等。

虽然在遗留应用程序的情况下它can be done不会因为新代码而让你的生活变得困难和app app。

通过重命名访问相关记录的PK来纠正问题就像这样简单:

Section.joins(:students).where(students: { id: x })
# or
Section.joins(:enrollment).where(enrollment: { student_id: x })
# or
student = Student.eager_load(:sections).find(x)
student.sections