ruby / rails - hash max by:key不返回最大值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ruby / rails - hash max by:key不返回最大值相关的知识,希望对你有一定的参考价值。

我有一个查询,查找给定日期@s_date上的所有事件。事件start_datetime在白天内 - 事件end_datetime在白天内

@s_hash_items = @company.events.where('(start_datetime > ? AND start_datetime < ?) OR 
  (end_datetime > ? AND end_datetime < ?)', 
          @s_date.beginning_of_day, @s_date.end_of_day, 
          @s_date.beginning_of_day, @s_date.end_of_day)

然后我试图从这个数组中找到最新的end_datetime值。例如。有3个活动在14:00,17:30和15:00完成,我想在17:30返回。但是,如果有一个事件持续到第二天,我希望最大结果是@s_date上的23:59:59)。

我这样做的代码看起来像这样

   @s_end_hour = [@s_hash_items2.max_by{:end_datetime}.end_datetime, Time.now.end_of_day].sort.first.hour

因此,它生成一个具有最新结束日期时间和结束日期的数组,然后选择较早的那个(sort.first),然后返回小时数,例如在这种情况下为17。

但是,max_by方法未找到具有最新end_datetime的事件。它似乎取决于@s_hash_items结果的顺序。但@s_hash_items的顺序无关紧要 - 我只想要最大值。我在这做错了什么?谢谢。

答案

这不符合你的想法:

@s_hash_items2.max_by{:end_datetime}

这跟说:

@s_hash_items2.max_by { 11 }

即你要求max_by找到具有最大:end_datetime符号(一个常数值)的元素,这有点无意义。

如果你想让max_by调用end_datetime方法,那么你需要一个块来返回对象的end_datetime值:

@s_hash_items2.max_by { |item| item.end_datetime }

或者更简洁(也可能是你想说的):

@s_hash_items2.max_by(&:end_datetime)

在前面的第一个例子中,&或多或少地将符号转换为{ |item| item.end_datetime }块。

以上是关于ruby / rails - hash max by:key不返回最大值的主要内容,如果未能解决你的问题,请参考以下文章

Ruby将Object转换为Hash

将 Nokogiri 文档转换为 Ruby 哈希

rails应用程序中的`to_hash`是什么?

Ruby / Rails 4.2 - 如果A && B,其中B条件取决于Rails环境

Ruby on Rails 将盐传递给 Digest::SHA512

从哈希/ YAML 中删除所有空元素?