鉴于下面列出的关系,我正在尝试编写一个活动记录查询,该查询将返回给定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?
列表?
栏目
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
答案 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