[英]Complex join in Rails
我有兩個模型:ProgramStudent和StudentCheckIn(一個學生可以有許多班級簽到,所以StudentCheckIn屬於ProgramStudent)。 ProgramStudent具有date_of_rank日期列,該列指示他們何時達到當前排名。
我想生成一個查詢,以標識自從date_of_rank以來具有多個X簽入的所有ProgramStudents。
StudentCheckIn模型具有以下范圍:
scope :since, -> (date) { where("checked_in_at >= ?", date) }
我可以構造一個合並此范圍的查詢,如下所示:
ProgramStudent.joins(:student_check_ins)
.merge(StudentCheckIn.since(Date.today - 2.months))
.group("program_students.id")
.having("count(*) > ?", 15)
生成以下SQL:
SELECT "program_students".* FROM "program_students"
INNER JOIN "student_check_ins"
ON "student_check_ins"."program_student_id" = "program_students"."id"
WHERE (checked_in_at >= '2016-02-12')
GROUP BY program_students.id
HAVING count(*) > 15
這將返回自固定日期(在本例中為兩個月前)以來具有15個以上簽入值的所有ProgramStudents,但是我希望查詢使用單個ProgramStudent的date_of_rank,而不是固定日期。 有沒有辦法用ActiveRecord做到這一點? 如果沒有,將如何使用原始SQL來完成?
這是您要針對的SQL:
SELECT "program_students".* FROM "program_students"
INNER JOIN "student_check_ins"
ON "student_check_ins"."program_student_id" = "program_students"."id"
WHERE (checked_in_at >= "program_students"."date_of_rank")
GROUP BY program_students.id, program_students.date_of_rank
HAVING count(*) > 15
我懷疑您的since
范圍是否可以使用列名,因為任何字符串輸入都可能會被轉義,但是您可以將where
子句放在最終的Arel中:
ProgramStudent.joins(:student_check_ins).
where("student_check_ins.checked_in_at >= program_students.date_of_rank").
group("program_students.id, program_students.date_of_rank").
having("count(*) > ?", 15)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.