最佳实践,在红宝石(而非铁轨)时间比较

时间:2017-02-03 05:25:18

标签: ruby rubygems

我是Ruby的新手,想要了解时间比较的最佳实践

我有一个对象的expireAt时间戳,我需要应用一些逻辑并与当前时间进行比较。记住这个背景。

哪种方法更好,

if Time.now.to_i < obj.expireAt
  // some logic
end

if Time.now < Time.at(obj.expireAt)
  // some logic
end

提前致谢!

2 个答案:

答案 0 :(得分:1)

根据您的代码,obj.expireAt似乎是一个简单的整数。 Ruby中的常规最佳实践是将对象的属性改为TimeDateTime的实例。 (有关这两个选项之间的差异的讨论,请参阅this question。)如果您的数据以整数形式出现,请在将值存储在实例变量中时进行一次转换,而不是在为其他目的访问时重复进行。您可以随时缓存整数,并通过其他方法使其可用,如果您需要将其退回而不向后运行转换。

这被认为是最佳实践,因为它使属性自我记录和自包含。你可以检查一个对象并确定它的类是什么(虽然这样做以编程方式在Ruby中被认为是坏形式,我们通常更喜欢Duck Typing)。如果我查看从expireAt返回的值,并看到它是Fixnum,那么它并没有告诉我任何有用的信息。我必须推断它是一个时间戳,并做额外的工作来将其转换为具有有用的时间相关语义的值。如果它是Time,我不仅知道它是什么,而且我可以使用该类的所有方法来操纵它。

由于Ruby中的所有内容都是一个对象(因此也是某个类的实例),因此您也可以使用一个专门用于使用值的类。

答案 1 :(得分:0)

如果您在数据库中获得了一个由Rails解释为DateTime值的值,那么请执行以下操作:

if Time.now < obj.expire_at
  # ...
end

无需使用atto_i进行转换。在许多情况下,这是毫无意义和浪费的。

使用文字TIMESTAMP列通常不是最佳的,这是MySQL中的一种弱数据类型,它的自动填充方便,但它是自动填充的。也是有限的,价值不可能超过2038年,让自己陷入不可避免的Y2K型问题。

另请注意,Ruby on Rails strong 鼓励使用全小写变量和列名称。 expireAt非常不正常。