比较Rails活动记录中的最后一个元素

时间:2015-09-24 15:31:15

标签: sql ruby-on-rails activerecord

我有两个模型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])

显然,上述说法不正确,但我希望它能说明我想要的内容。

3 个答案:

答案 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

比特复杂......可能是语法错误......如果有,请告诉我。