【问题标题】:Best practise, in ruby (not rails) time comparision最佳实践,在 ruby​​ (on rails) 时间比较中
【发布时间】:2017-06-20 10:01:38
【问题描述】:

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

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

哪种方法更好,

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

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

提前致谢!

【问题讨论】:

  • obj.expireAt 的类是什么?根据您的代码,它似乎是一个简单的整数。 Ruby 中的最佳实践是首先使对象的该属性成为TimeDateTime 的实例,并且在设置该值的任何位置只进行一次转换。然后在您的代码中,您只需执行Time.now &lt; obj.expireAt 而不调用to_iTime.at
  • obj.expireAt 是简单的整数(时间戳)。你能解释一下为什么最好与时间或日期时间进行比较。只是想知道。
  • 因为它是自我记录和自包含的。您可以检查一个对象并确定它的类是什么;如果是Fixnum,那并不能告诉你任何有用的信息。您必须以某种方式知道它是时间戳以及如何将其转换为实际时间值。如果它是Time,那么您不仅知道它是什么,而且您拥有该类的所有方法来操作它。 Ruby 中的一切都是某个类的实例;您不妨使用与您的价值相匹配的那个。
  • @MarkReed 你对此很熟悉。如果您可以添加一个,将接受答案:+1

标签: ruby rubygems


【解决方案1】:

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

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

由于 Ruby 中的所有内容都是一个对象(因此是某个类的实例),因此您不妨使用一个旨在按照您的值使用方式使用的类。

【讨论】:

    【解决方案2】:

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

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

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

    使用文字 TIMESTAMP 列通常是次优的,这是 MySQL 中的弱数据类型,它很方便,因为它是自动填充的,但它也是有界的,值不能超过 2038 年,为自己设置一个不可避免的 Y2K 类型问题。

    另请注意,Ruby on Rails 强烈 鼓励使用全小写的变量和列名。 expireAt 非常不规则。

    【讨论】:

    • 请阅读我的问题。我正在寻找纯红宝石的答案。没有 Rails 框架。
    • 请注意您标记了您的问题 Rails,这通常是您回答偏好的有力指标。同样的建议也适用。
    • 感谢您提供的信息。删除了我的标签。我们无法真正将时间戳与 Time 对象进行比较。
    • 您使用的是什么数据库适配器层? Sequel 是一个非常严肃的轻量级层,对我来说效果很好,它为你做了很多这种转换。您使用的是文字 UNIX time_t 时间戳值还是 TIMESTAMP 列?您需要具体说明这些事情并举例说明。
    猜你喜欢
    • 2011-09-29
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多