使用活动记录的复杂Ruby SQL查询-其中使用OR子句和子查询
我正在使用Ruby 2.0.0和Rails 4.1.0 我正在努力将复杂的SQL查询转换为Ruby。我能够转换其中的大部分内容,但我在使用OR子句时遇到了困难 以下是原始SQL查询:使用活动记录的复杂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 "
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)