0

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

课程(:id, :name)

course_details (:course_id, :effective_date, :status),

course_codes (:course_detail_id, :code)

课程有很多 course_details

course_detail 有很多课程代码

课程可以有多条有效日期适用的 course_details 记录(意味着系统中只会使用一条 course_detail 记录)。

问题陈述:我想通过给定代码的课程代码过滤课程。并且课程应该只被与有效日期 course_detail 链接的 course_codes 过滤,并且应该跳过过去有效日期的记录。

course = Course.find(params[:id])

course_detail = CourseDetail.find_by(effective_date: CourseDetail.max(effective_date), course_id: course.id)

如果我使用此代码,这将过滤课程而不考虑有效日期课程详细信息:

Course.left_joins(course_details: :course_codes).where(course_details: { course_codes: { code: params[:code] } })

培训班:

ID 姓名
1 英语
2 数学

课程详情:

ID course_id 生效日期
1 1 2020-10-01
2 1 2021-01-01
3 2 2020-09-01

课程代码:

ID course_detail_id 代码。
1 1 eng-01
2 2 英505
3 3 数学-01

当我通过code = eng-01它应该返回空数组而不是 id 1。

有人能帮帮我吗?

4

1 回答 1

0

为了解决这个问题,我使用了一个子查询,它根据有效日期返回所有课程的 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] } })

它按预期工作。

于 2021-02-15T10:08:25.350 回答