如何创建范围以比较关联模型上的最后一个日期实例?

时间:2015-12-11 22:19:34

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

假设我有一个具有多个期间的合约模型(用于衡量合约的期限和任何续约期)。合同中的每个期间都有一个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

但我不知道如何将这样的事情纳入范围。

1 个答案:

答案 0 :(得分:1)

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

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