2012-09-06 88 views
1

我有一個保單類,在這個類中,我有兩個方法來確定客戶是否可以更新他們的保單。ruby​​中這個日期比較邏輯有什麼問題嗎?

他們是這樣的:(在policy.rb模型)

def is_renewable? 
    if has_not_been_renewed? 
     self.ends_on >= Date.today && self.ends_on <= Date.today + 60.days 
    end 
    end 

    def has_not_been_renewed? 
    been_renewed = self.renewed_policy.nil? || !self.renewed_policy.active? || !self.active? 
    end 

所以,出於某種原因,這是我工作的本地機器上而不是在我們的分期環境。 (我知道正確,每個程序員的禍根都是「但它在我的機器上工作!」)。

邏輯看起來很簡單:首先檢查以確保它尚未續訂或者他們有不同的活動策略。然後檢查以確保它尚未過期,並且在未來60天內有時會過期。

這是從該行的觀點稱作:

<%= link_to('Renew', {:action => 'renew', :id => policy.id}, {:class => 'btn btn-success'}) if policy.is_renewable? %> 

我真的不能明白爲什麼這不會在任何地方工作。我不會問,但我一整天都在看這個愚蠢的問題,需要一組新的眼睛來看看它。謝謝

對此有所幫助,兩個數據庫(本地和分期)格式的格式如下: yyyy-mm-dd因此今天的日期將是2012-09-06

+0

「在我的本地機器上工作,但不在我們的升級環境中」是什麼意思?像邏輯返回不正確,或者引發異常? –

+0

它回來不正確,所以測試我的本地機器上的用例,它工作得很好。任何已過期的政策都沒有續訂按鈕,並且任何在未來60天內過期的政策都會生效。而任何在60天后過期的東西都沒有續訂按鈕。已過期的分段策略沒有續訂按鈕(按預期工作),但在未來60天內過期的策略也沒有續訂按鈕(不按預期工作,應該有更新按鈕) – Ryan

+0

有如果它是方法'has_not_been_renewed?'的最後一個語句,那麼不需要設置變量'been_renewed' –

回答

2

假設您在登臺數據庫時沒有數據完整性問題(例如ends_on不是你認爲在沒有一個時應該有一個更新的策略),你可能想要檢查系統時鐘,並確保它是準確的,並使用你期望的時區。

+0

+1給我一個新的想法,以瞭解。我檢查了臨時數據庫,日期格式與我的開發機器上的相同。我會發布格式是什麼。 – Ryan

+0

我實際上是指日期的實際值,而不是格式問題。確保檢查數據庫中的日期時間,期望的內容和Ruby使用的內容(應該與系統時鐘一致)和區域問題之間的差異。例如,如果您的登臺機器設置爲UTC並且您在PDT中,則「Date.today」可能不會返回您期望的值。 – kueda

0

對數據庫的策略(以及數據庫在分段和開發環境中有所不同)?在某些情況下,您應該將日期格式設置爲對數據庫更易分解的格式,例如 Time.now.to_s(:db)