让我们假设,数据库中有三个表:
(: id、名称)
course_details(:course_id,: effecve_date,:status),
course_codes(: course_detail_id:代码)
course has many course_details
course_detail有多个cource_codes
课程可以有多个有效日期适用的course_details记录(意味着系统中只会使用一个course_detail记录)。
问题陈述:我想通过课程代码来筛选课程。course应该只通过与有效日期的course_detail链接的course_codes进行过滤,并且应该跳过过去的有效日期记录。
course = Course.find(params[:id])
course_detail = CourseDetail.find_by(effective_date: CourseDetail.max(effective_date), course_id: course.id)
如果我使用这段代码,它将过滤课程,而不管effective _dates course_details:
Course.left_joins(course_details: :course_codes).where(course_details: { course_codes: { code: params[:code] } })
课程:
为了解决这个问题,我使用了一个子查询,它根据effecve_date返回所有课程的course_details的id:
query = "select child.id from courses as parent
inner join course_details as child on child.course_id = parent.id
where child.effective_date =
(select max(child1.effective_date) as effective_date
from course_details as child1
where child1.course_id = parent.id
and (child1.effective_date <= CURRENT_DATE
or child1.effective_date = (select min(child2.effective_date) as effective_date
from course_details as child2
where child2.course_id = parent.id)
))"
effective_dated_ids = Course.find_by_sql(query).pluck(:id)
得到所有的id后,我在搜索中传递这些id。
records = Course.left_joins(course_details: :course_codes).where(course_details: { id: effective_record_ids, course_codes: { course_code: params[:course_code] } })
效果如预期。