我的广告系列模型中包含以下范围:
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年,直到用户更新为止。
有没有一种更优雅的方法可以做到这一点,我错过了?
答案 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))
)
)
}
当然,它有点冗长,但应该有效。