2013-09-26 135 views
1

我寫一個應用程序,將更新的最後一次有人登錄到應用程序一點點更新,然後保存它。其在軌3.2和紅寶石1.9.3p327紅寶石零轉換TO_DATE

def update_last_seen 
    if current_account.present? 
    if (Date.current - 1.day) > current_account.last_login_at 
     current_account.last_login_at = Date.current 
     current_account.save 
    end 
    end 
end 

我堅持認爲到應用程序控制器和濾波器之前與調用它。唯一的一點是,有時我的日期是零。因此比較日期和零給出錯誤。你無法在nil上調用to_date。

nil.to_f => 0.0 
nil.to_i => 0 
nil.to_s => "" 
nil.to_date => NoMethodError: undefined method `to_date' for nil:NilClass 
"2013/07/26".to_date => Fri, 26 Jul 2013 

我怎麼可以把它設置爲它是它被接受爲一個空的日期。

我總是可以做

if current_account.last_login_at.blank? || (Date.current - 1.day) > current_account.last_login_at 

這樣,如果它不存在,將它設置,但有沒有做這件事的語義的方式?

更新:

您可能認爲這沒有意義。我問的原因是因爲有些引擎的日期爲零。例如excel會以兩種方式返回日期1.作爲"06/12/2013"中的文本或2.從01/01/1900開始的整數。該日期是擅長的nil日期我希望有一個Ruby的nils的默認日期。如果沒有,你可以只是評論nope沒有抱歉的人。爲什麼意味着你真的不在乎幫助/教導任何你只是在推擠按鈕的事物而沒有給出解釋。如果我在這個問題上做了錯誤的事情,你可以告訴我,試着修復它,如果它沒有意義?

+1

爲什麼兩行分配和保存。而是使用update_attributes。 'current_account.update_attributes(:last_login_at => Date.current)'這樣可以避免額外的顯式保存調用。 update_attributes將自動調用保存。檢查這個http://maxivak.com/update_attribute-and-update_attributes-ruby-on-rails/ –

+0

我喜歡那樣。謝謝,看起來好多了。很好的鏈接以及 – TheLegend

+0

真,我會更新我的答案 - 也,你應該不用擔心,如果你有'after_save'回調,因爲那些被調用兩個創建和更新保存。 – Momer

回答

2

你可以在另一種方法添加清理代碼位。

def new_login_since?(last_login) 
    last_login.blank? || (Date.current - 1.day) > last_login 
end 

def update_last_seen 
    if current_account.present? && new_login_since?(current_account.last_login_at) 
    current_account.update_attributes { last_login_at: Date.current } 
    end 
end 
+0

謝謝你。是的,我認爲這是回合。 – TheLegend

+0

沒問題 - 也,只看見自己的編輯 - 如果你處理很多不同的默認的「零」日期(即:從Excel中提到的),你可以抽象的零日辦理了一個服務對象。更多關於[Railscasts]的信息(http://railscasts.com/episodes/398-service-objects?view=asciicast) – Momer

+0

是的,這就是我的問題。我從多個來源拉入,無日期的事情讓事情變得凌亂。服務對象,我認爲將是最好的解決方案。我現在正在經歷它。猜猜今晚會重新考慮夜晚。哈哈 – TheLegend

1

要回答這個問題,實際...你可以猴子修補NilClass這樣

class NilClass 
    def to_date 
    Date.today 
    end 
end 

nil.to_date # => #<Date: 2013-09-26 ((2456562j,0s,0n),+0s,2299161j)> 

當然,公認的答案顯示了更好的方法。