使用活动记录的复杂Ruby SQL查询-其中使用OR子句和子查询

使用活动记录的复杂Ruby SQL查询-其中使用OR子句和子查询,sql,ruby,activerecord,Sql,Ruby,Activerecord,我正在使用Ruby 2.0.0和Rails 4.1.0 我正在努力将复杂的SQL查询转换为Ruby。我能够转换其中的大部分内容,但我在使用OR子句时遇到了困难 以下是原始SQL查询: SELECT DISTINCT "lecture_classes".* FROM "lecture_classes" INNER JOIN "lectures" ON "lectures"."id" = "lecture_classes"."lecture_id" INNER JOIN "

我正在使用Ruby 2.0.0和Rails 4.1.0

我正在努力将复杂的SQL查询转换为Ruby。我能够转换其中的大部分内容,但我在使用OR子句时遇到了困难

以下是原始SQL查询:

SELECT DISTINCT "lecture_classes".* 
FROM "lecture_classes" 
INNER JOIN 
    "lectures" ON "lectures"."id" = "lecture_classes"."lecture_id" 
INNER JOIN 
    "weeks" ON "weeks"."id" = "lectures"."week_id"  
WHERE "lectures"."part" = 1 
    AND "weeks"."number" = 1 
    AND "weeks"."course_id" = 1 
    AND(                                          --very important parenthesis start
        "lecture_classes"."id" IN (
        SELECT "lecture_enrollments"."lecture_class_id" 
        FROM "lecture_enrollments"  
        GROUP BY lecture_class_id 
        HAVING count(lecture_class_id) <= 5
        ) 
        OR "lecture_classes"."id"                --this is the OR that needs to have Ruby equivalent
        NOT IN (
            SELECT "lecture_enrollments"."lecture_class_id"
            FROM "lecture_enrollments"
            )  
    )                                           --very important parenthesis ends
ORDER BY "lecture_classes"."class_date" ASC
但我的问题是我没有OR值,它是select语句的结果。如何用Ruby编写

有什么想法吗

谢谢

***更新:

谢谢你,德鲁,行得通

根据你之前的回答,我试着让它更漂亮,更像红宝石,所以我做到了

@max_students = 5 

LectureClass
       .joins(:lecture, lecture: :week)
       .where(lectures: {part: part})
       .where(weeks: {number: week, course_id: course})
       .where(id: LectureEnrollment
                  .select("lecture_class_id")
                  .group("lecture_class_id")
                  .having("count(lecture_class_id) <= ?",@max_students)
                  )
       .or( LectureClass
            .where
            .not(id:[LectureEnrollment
                          .select(:lecture_class_id)
                     ])
            )
       .distinct
       .order(class_date: :asc)

然而,我得到一个错误,说NoMethodError-UndefinedMethod'or'。我想这是一个arel依赖的方法,但我不想仅仅为了解决OR问题而添加这个库。SQL混合非常有效。谢谢

以下内容如何

LectureClass
       .joins(:lecture, lecture: :week)
       .where(lectures: {part: part})
       .where(weeks: {number: week, course_id: course})
       .where("lecture_classes.id IN (
        SELECT lecture_class_id
        FROM lecture_enrollments 
        GROUP BY lecture_class_id 
        HAVING count(lecture_class_id) <= ?
        ) 
        OR lecture_classesid
        NOT IN (
            SELECT lecture_class_id
            FROM lecture_enrollments
            )", @max_students)
       .distinct
       .order(class_date: :asc)
@max_students = 5 

LectureClass
       .joins(:lecture, lecture: :week)
       .where(lectures: {part: part})
       .where(weeks: {number: week, course_id: course})
       .where(id: LectureEnrollment
                  .select("lecture_class_id")
                  .group("lecture_class_id")
                  .having("count(lecture_class_id) <= ?",@max_students)
                  )
       .or( LectureClass
            .where
            .not(id:[LectureEnrollment
                          .select(:lecture_class_id)
                     ])
            )
       .distinct
       .order(class_date: :asc)
LectureClass
       .joins(:lecture, lecture: :week)
       .where(lectures: {part: part})
       .where(weeks: {number: week, course_id: course})
       .where("lecture_classes.id IN (
        SELECT lecture_class_id
        FROM lecture_enrollments 
        GROUP BY lecture_class_id 
        HAVING count(lecture_class_id) <= ?
        ) 
        OR lecture_classesid
        NOT IN (
            SELECT lecture_class_id
            FROM lecture_enrollments
            )", @max_students)
       .distinct
       .order(class_date: :asc)