【问题标题】:How do I check to an array of objects with the parameter start_at, which is a Datetime is before DateTime.now如何使用参数 start_at 检查对象数组,这是一个 Datetime 在 DateTime.now 之前
【发布时间】:2016-12-04 09:06:23
【问题描述】:

我有一个图像数组,它们在一个名为 categories_images 的数组中都有特定的类别。图像有一个 start_at 字段,有时为 nil,有时在其中包含 DateTime。我希望那些在当前 DateTime 之前开始的 DateTime 出现在我的页面上。

我写了以下代码:

def now
  categories_images.select { |image| image['start_at'] }
end

这给了我所有 start_at 没有 nil 的图像。

所以我问:

def now
  categories_images.select { |image| image['start_at']  < DateTime.now }
end

认为它会给我那些相同的图像,除了那些没有早于“现在”的 start_at 日期的图像。相反,它给了我:

undefined method `<' for nil:NilClass

我做错了什么?我知道这可能是 ruby​​ 102 的东西,但我是一个有梦想的新面孔的孩子,需要一些帮助。是不是说 DateTime.now 是 nil 所以它不能检查它?如果是这样,为什么,这不是适用于 DateTime 的合法方法吗?

任何帮助将不胜感激。

【问题讨论】:

  • 您可以将其更改为在同一块中使用两个条件。 categories_images.select { |image| image['start_at'] &amp;&amp; image['start_at'] &lt; DateTime.now } 这表示所有有 start at 以及 start_at 小于现在的图像。
  • @engineersmnky 酷,这工作。谢谢!现在我看到了,我不知道我以前是怎么做到的。

标签: ruby-on-rails arrays ruby postgresql datetime


【解决方案1】:

我认为该数组中的图像尚未设置start_at

所以你可以:

categories_images.select do |image|
  image["start_at"] < Time.now if image["start_at"]
end

只检查是否设置了“start_at”。因为如果不是,这个表达式将返回 nil,这将被解释为 false。

【讨论】:

    【解决方案2】:

    我怀疑,除非值为 nil,否则比较会按预期执行。这就是为什么在这些情况下您必须跳过比较:

    categories_images.select { |image| image['start_at'] < DateTime.now unless image['start_at'].nil? }
    

    【讨论】:

    • 一行代码可能会解决问题,但并不构成答案。为什么不发布一些有关其工作原理的信息并回答 OP 提出的一些问题。
    猜你喜欢
    • 2013-07-29
    • 1970-01-01
    • 2020-07-25
    • 2012-05-30
    • 1970-01-01
    • 2012-12-13
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多