2017-04-01 68 views
0

我試圖解決的問題是確定用戶上個月是否創建了「提示」。此檢查將在用戶創建新提示後完成。如何搜索日期數組以確定一個或多個是否在指定範圍內

我有一個名爲「tip_dates」的用戶過去的提示日期字符串數組。我現在使用rails的解決方案遍歷數組中的每個值,將其轉換爲日期,並檢查它是否在一個月內。

這是最有效的解決方案嗎?我擔心,當日期數組變大時,此檢查可能需要很長時間。

def tip_last_month 
    start_date = Date.today.beginning_of_month - 1.month 
    end_date = start_date.end_of_month 
    for tip_date in self.tip_dates do 
     if tip_date.to_date.between?(start_date, end_date) 
      return true 
     end 
    end 
    return false 
end 

回答

0

Ruby的人真的不使用for和明確return -s在函數結束。最後一個表達式的值將默認返回。

我在這裏做的是我創建一個數組,通過將字符串映射到日期對象,然後將它們傳遞給any?塊,第一次匹配將返回true,如果沒有則返回false。

def tip_last_month 
    start_date = Date.today.beginning_of_month - 1.month 
    end_date = start_date.end_of_month 

    tip_dates.map(&:to_date).any? do |date| 
    date.between?(start_date, end_date) 
    end 
end 

確實,隨着數組變大,這個函數會變慢。您應該考慮將提示存儲在數據庫中的單獨表格中,方法是每條提示都有一條記錄並按日期查詢。這樣做會快得多。

你可以閱讀更多有關協會在這裏:

http://guides.rubyonrails.org/association_basics.html

+0

謝謝!在這種情況下,對於這個陣列來說,什麼是「大」?基本上,你會優先考慮解決這個性能問題? – TCEchicago

+0

如果應用程序的主要域名是圍繞提示,或者我希望用戶會隨着時間的推移定期添加提示(因此每個用戶的提示數量將隨之增加)。基本上,我會隨時單獨列出一張表,除非應用程序非常簡單,不值得花時間設置單獨的表格。 :) – kriskova

+0

非常感謝你的時間和周到的答案!根據你的回答,我認爲我在眼前是沒問題的。 – TCEchicago

相關問題