最佳实践,ruby(非rails)时间比较

最佳实践,ruby(非rails)时间比较,ruby,rubygems,Ruby,Rubygems,我对Ruby很陌生,想了解时间比较中的最佳实践 我有一个对象的expireAt时间戳,我需要应用一些逻辑并与当前时间进行比较。考虑到这个背景 哪种方法更好 if Time.now.to_i < obj.expireAt // some logic end 如果Time.now.to_i

我对Ruby很陌生,想了解时间比较中的最佳实践

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

哪种方法更好

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

if Time.now

提前谢谢

如果数据库中有一个值被Rails解释为
DateTime
值,则执行以下操作:

if Time.now < obj.expire_at
  # ...
end
如果Time.now
无需使用
at
转换为_i
。在许多情况下,这是毫无意义和浪费的

使用literal
TIMESTAMP
列通常是次优的,这是MySQL中的一种弱数据类型,因为它是自动填充的,但它也是有界的,值不能超过2038年,这将使您面临不可避免的Y2K类型问题


还要注意,RubyonRails强烈支持所有小写变量名和列名
expireAt
非常不规则。

根据您的代码,
obj.expireAt
似乎是一个简单的整数。Ruby中通常的最佳实践是将对象的属性作为或的实例。(有关这两个选项之间差异的讨论,请参阅。)如果数据是以整数形式输入的,请在实例变量中存储值时进行一次转换,而不是在出于其他目的访问该值时重复转换。如果需要在不反向运行转换的情况下将整数取出,则可以始终缓存该整数,并通过另一种方法使其可用

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


由于Ruby中的所有内容都是对象(因此也是某个类的实例),因此您最好使用一个设计用于使用您的值的类。

请阅读我的问题。我在寻找纯红宝石的答案。没有Rails框架。请注意,您将问题标记为Rails,这通常是您答案偏好的有力指标。同样的建议也适用。谢谢你提供的信息。取下我的标签。我们无法将时间戳与时间对象进行比较。您使用的是哪个数据库适配器层?这是一个非常简单、轻量级的图层,对我来说效果非常好,它为你做了很多转换。您使用的是文字UNIX
time\t
timestamp值还是
timestamp
列?你需要具体说明这些事情并举例说明。
obj.expireAt
的类别是什么?根据您的代码,它似乎是一个简单的整数。Ruby中的最佳实践是首先将对象的属性设置为
Time
DateTime
的实例,并且在设置该值的地方只进行一次转换。然后,在代码点,您只需执行
Time.now
,而不调用
到i
Time。at
obj.expireAt
是简单的整数(时间戳)。你能给我解释一下为什么最好和时间或日期时间比较吗。只是想知道。因为它是自我记录和自我包含的方式。您可以检查对象并确定其类别;如果它是
Fixnum
,它不会告诉您任何有用的信息。您必须知道它是一个时间戳,以及如何将其转换为实际时间值。如果是
时间
,那么您不仅知道它是什么,而且还可以使用该类的所有方法来操作它。Ruby中的一切都是某个类的实例;您也可以使用与您的价值相匹配的价值。@MarkReed您对此很满意。将接受答案,如果您可以添加一个:+1
if Time.now < obj.expire_at
  # ...
end