【问题标题】:How do I create a scope to compare the last instance of a date on an associated model?如何创建范围以比较关联模型上日期的最后一个实例?
【发布时间】:2015-12-11 22:19:33
【问题描述】:

假设我有一个包含多个期间的合同模型(用于衡量合同的持续时间和任何续订期)。合同中的每个期间都有一个 end_date。我正在使用 Rails Admin,它为我提供了使用我在 Contract 模型和 Rails Admin 配置中定义的任何范围的能力列表 Contracts。我想创建一个 :expired 范围,其中列出了合同最后一个期间的 end_date 早于今天日期的所有合同。简单地说,我想要一个只列出过期合同的范围。

我试过这个:

scope :expired, -> { joins(:periods).where('periods.end_date < ?', Date.today) }

这不起作用,因为如果合同的任何期限(而不仅仅是最后一个期限)已过期,它会给出误报显示合同已过期。

对于它的价值,我已经有一个 current_end_date 实例方法,它可以通过本质上为我提供合同的当前结束日期:

periods.last.end_date

但我不知道如何在范围内使用类似的东西。

【问题讨论】:

  • 您可能需要将此查询分成两部分;获取每个合同的最新期间的子查询,以及在子查询找到的期间中查找过期的 end_dates 的查询。

标签: ruby-on-rails ruby scope rails-admin


【解决方案1】:

我同意@James - 最容易分成两个子查询,但是我会首先找到所有未过期的合同:

scope :non_expired, -> { joins(:periods).where('periods.end_date >= ?', Date.today) }
scope :expired, -> { where.not(id: non_expired.pluck(:id)) }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多