如何创建一个范围来比较关联模型上日期的最后一个实例?
How do I create a scope to compare the last instance of a date on an associated model?
假设我有一个包含多个周期的合同模型(以衡量合同的持续时间和任何续订期限)。合同中的每个 Period 都有一个 end_date。我正在使用 Rails Admin,它使我能够使用我在合同模型和 Rails Admin 配置中定义的任何范围列出合同。我想创建一个 :expired 范围,其中列出合同最后一个期间的 end_date 早于今天日期的所有合同。简单地说,我想要一个只列出过期合同的范围。
我试过这个:
scope :expired, -> { joins(:periods).where('periods.end_date < ?', Date.today) }
这是行不通的,因为它会给出误报,如果合同的任何一个周期都已过期,而不仅仅是最后一个,它就会显示合同已过期。
为了它的价值,我已经有了一个 current_end_date 实例方法,它可以通过以下操作为我提供合同的当前结束日期:
periods.last.end_date
但我不知道如何将类似的东西应用到范围中。
我同意@James - 最容易分成两个子查询,但是我会首先找到所有未过期的合同:
scope :non_expired, -> { joins(:periods).where('periods.end_date >= ?', Date.today) }
scope :expired, -> { where.not(id: non_expired.pluck(:id)) }
假设我有一个包含多个周期的合同模型(以衡量合同的持续时间和任何续订期限)。合同中的每个 Period 都有一个 end_date。我正在使用 Rails Admin,它使我能够使用我在合同模型和 Rails Admin 配置中定义的任何范围列出合同。我想创建一个 :expired 范围,其中列出合同最后一个期间的 end_date 早于今天日期的所有合同。简单地说,我想要一个只列出过期合同的范围。
我试过这个:
scope :expired, -> { joins(:periods).where('periods.end_date < ?', Date.today) }
这是行不通的,因为它会给出误报,如果合同的任何一个周期都已过期,而不仅仅是最后一个,它就会显示合同已过期。
为了它的价值,我已经有了一个 current_end_date 实例方法,它可以通过以下操作为我提供合同的当前结束日期:
periods.last.end_date
但我不知道如何将类似的东西应用到范围中。
我同意@James - 最容易分成两个子查询,但是我会首先找到所有未过期的合同:
scope :non_expired, -> { joins(:periods).where('periods.end_date >= ?', Date.today) }
scope :expired, -> { where.not(id: non_expired.pluck(:id)) }