我是Ruby的新手,想要了解时间比较的最佳实践
我有一个对象的expireAt
时间戳,我需要应用一些逻辑并与当前时间进行比较。记住这个背景。
哪种方法更好,
if Time.now.to_i < obj.expireAt
// some logic
end
或
if Time.now < Time.at(obj.expireAt)
// some logic
end
提前致谢!
答案 0 :(得分:1)
根据您的代码,obj.expireAt
似乎是一个简单的整数。 Ruby中的常规最佳实践是将对象的属性改为Time
或DateTime
的实例。 (有关这两个选项之间的差异的讨论,请参阅this question。)如果您的数据以整数形式出现,请在将值存储在实例变量中时进行一次转换,而不是在为其他目的访问时重复进行。您可以随时缓存整数,并通过其他方法使其可用,如果您需要将其退回而不向后运行转换。
这被认为是最佳实践,因为它使属性自我记录和自包含。你可以检查一个对象并确定它的类是什么(虽然这样做以编程方式在Ruby中被认为是坏形式,我们通常更喜欢Duck Typing)。如果我查看从expireAt
返回的值,并看到它是Fixnum
,那么它并没有告诉我任何有用的信息。我必须推断它是一个时间戳,并做额外的工作来将其转换为具有有用的时间相关语义的值。如果它是Time
,我不仅知道它是什么,而且我可以使用该类的所有方法来操纵它。
由于Ruby中的所有内容都是一个对象(因此也是某个类的实例),因此您也可以使用一个专门用于使用值的类。
答案 1 :(得分:0)
如果您在数据库中获得了一个由Rails解释为DateTime
值的值,那么请执行以下操作:
if Time.now < obj.expire_at
# ...
end
无需使用at
或to_i
进行转换。在许多情况下,这是毫无意义和浪费的。
使用文字TIMESTAMP
列通常不是最佳的,这是MySQL中的一种弱数据类型,它的自动填充方便,但它是自动填充的。也是有限的,价值不可能超过2038年,让自己陷入不可避免的Y2K型问题。
另请注意,Ruby on Rails strong 鼓励使用全小写变量和列名称。 expireAt
非常不正常。