2015-03-31 230 views
0

我有我的運動模型內的下列範圍與無END_DATE處理:在日期範圍範圍

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,我們可以假設一個活動仍然活躍,因此應包含在最終的關係。

我只是不知道該怎麼寫。在嘗試並且未能在範圍聲明中測試零值之後,我現在正在考慮將記錄中的默認日期設置爲從現在開始的50年,直到它由用戶更新。

有沒有更優雅的方式來做到這一點,我失蹤了?

+0

Postgres支持'infinity'。不知道Ruby是否支持這個,但是你可以試着'end_date <= coalesce(?,'infinity')' – 2015-03-31 06:08:19

回答

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)) 
    ) 
) 
} 

誠然,這是一個有點冗長,但它應該工作。

+0

冗長或者不行,謝謝! – macoughl 2015-03-31 00:40:38