簡體   English   中英

復雜的加入Rails

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM