2013-09-26 83 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)> 

当然,公认的答案显示了更好的方法。