Rails:条件子查询MAX(effective_date)



让我们假设,数据库中有三个表:

(: 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] } })

课程:

<表类>Id名称tbody><<tr>1英语2数学

为了解决这个问题,我使用了一个子查询,它根据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] } })

效果如预期。

相关内容

  • 没有找到相关文章

最新更新