在日期范围范围内处理nil end_date

时间:2015-03-31 00:04:39

标签: ruby-on-rails postgresql

我的广告系列模型中包含以下范围:

scope :dashboard_campaigns, ->(start_date, end_date, client_id) {where(client_id: client_id).where('start_date >= ? and end_date <= ?', start_date, end_date)}

此范围在指定的日期范围内收集campaigns,以便在信息中心内使用。

有时,当用户启动广告系列时,end_date未知,因此nil

如果end_date为nill,我们可以假设广告系列仍然有效,因此应该包含在结果关系中。

我只是不确定如何写。在尝试并且未能在范围声明中测试nil之后,我现在正在考虑将记录中的默认日期从现在开始为50年,直到用户更新为止。

有没有一种更优雅的方法可以做到这一点,我错过了?

1 个答案:

答案 0 :(得分:0)

使用arel和sql或语句,似乎你可以像这样完成它:

scope :dashboard_campaigns, ->(start_date, end_date, client_id) {
  where(client_id: client_id).where(
    (
      Campaign.arel_table[:start_date].gteq(start_date).and(Campaign.arel_table[:end_date].eq(nil))
    ).or(
      Campaign.arel_table[:start_date].gteq(start_date).and(Campaign.arel_table[:end_date].lteq(end_date))
    )
  )
}

当然,它有点冗长,但应该有效。