活动记录范围:仅包括所有连接的模型与where语句匹配的情况

时间:2017-06-06 17:41:00

标签: sql ruby-on-rails activerecord

我为客户提供以下范围:

scope :filter, -> {
    joins(:subscriptions)
    .where("subscriptions.end_date <= ?", 1.year.ago.to_date)
  }

如果客户有一个订阅少于一年但是如果他们有2个订阅且一个超过一年且一个少于一年,则此范围可以正常工作,它仍然包含在此范围内。

如果其中一个订阅与where语句不匹配,如何将范围写入NOT not the customer?

1 个答案:

答案 0 :(得分:1)

你可以做一个子查询,你可以计算订阅数量&gt; 1.year.ago,并将该计数与0进行比较 它看起来像这样

scope :filter, -> {
  joins(:subscriptions)
    .where("subscriptions.end_date <= ?", 1.year.ago.to_date)
    .where("(select count(subscriptions.id) from subscriptions where subscriptions.customer_id = id && subscriptions.end_date > ?) = 0", 1.year.ago.to_date)
}