我有两个模型Student和StudentRecord。学生记录的属性中包含start_date,end_date和class_course_id,属于学生
scope = Student.eager_load(:student_record)
现在,我想让最新的学生(根据start_date)student_record的class_course_id与给定的class_course_id相同。类似的东西:
scope = scope.where("student_records.order(start_date asc).last.class_course_id = ?", params[:class_course_id])
显然,上述说法不正确,但我希望它能说明我想要的内容。
答案 0 :(得分:0)
以下应该
{{1}}
答案 1 :(得分:0)
使用Order by
子句并下降以获取最新日期.order("student_records.start_date DESC")
,在where
子句中,记录将被过滤掉.where("student_records.class_course_id = ?", params[:class_course_id])
。 where
将首先出现,order by desc
将对其进行正确排序。
scope.where("student_records.class_course_id = ?", params[:class_course_id]).order("student_records.start_date DESC")
您可以.limit(5)
获取最新的start_dates前5条记录。
答案 2 :(得分:0)
如果你想要所有的学生,那么这在积极的记录中有点不重要。
识别最后的学生记录听起来像是一个可以从范围中受益的重要事项:
def self.latest_for_student
where("not exists (select null from student_records sr2 where sr2.student_id = student_records.student_id and sr2.start_date > student_records.start_date)")
end
...表示“返回相同student_id的student_records中不存在另一行的行,以及更大的start_date”
或者...
def self.latest_for_student
where("student_records.start_date = (select max(start_date) from student_records sr2 where sr2.student_id = student_records.student_id)")
end
...表示“返回开始日期等于该学生ID的最大开始日期的行”
然后你可以:
class Student
has_one :last_student_record, -> {merge(StudentRecord.latest_for_student)}, :class_name => "StudentRecord"
has_one :last_class_course, :through => :last_student_record, :source => :class_course
end
class ClassCourse
has_many :last_records_for_student, -> {merge(StudentRecord.latest_for_student)}, :class_name => "StudentRecord"
has_many :students_having_as_last_course, :through => : last_records_for_student, :source => :student
end
然后你应该能够:
@course.students_having_as_last_course
比特复杂......可能是语法错误......如果有,请告诉我。