假设我有一个具有多个期间的合约模型(用于衡量合约的期限和任何续约期)。合同中的每个期间都有一个end_date。我使用Rails Admin,它使用我在Contract模型和Rails Admin配置中定义的任何范围为我提供了能力列表合同。我想创建一个:过期的范围,列出合同的最后一个期间的end_date在今天的日期之前的所有合同。简单地说,我想要一个仅列出过期合同的范围。
我试过了:
scope :expired, -> { joins(:periods).where('periods.end_date < ?', Date.today) }
这不起作用,因为如果其任何期间过期而不仅仅是最后一期,它会显示合同已过期的误报。
对于它的价值,我已经有了一个current_end_date实例方法,可以通过以下方式为我提供合约的当前结束日期:
periods.last.end_date
但我不知道如何将这样的事情纳入范围。
答案 0 :(得分:1)
我同意@James - 最容易被分成两个子查询,但我会首先找到所有未过期的合同:
scope :non_expired, -> { joins(:periods).where('periods.end_date >= ?', Date.today) }
scope :expired, -> { where.not(id: non_expired.pluck(:id)) }