【问题标题】:ruby / rails - hash max by :key does not return largest valueruby / rails - hash max by :key 不返回最大值
【发布时间】:2019-03-21 01:19:56
【问题描述】:

我有一个查询在给定日期@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 值。例如。 14:00、17:30、15:00有3个赛事结束,我想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 的顺序无关紧要——我只想要最大值。我在这里做错了什么?谢谢。

【问题讨论】:

    标签: ruby ruby-on-rails-3.2


    【解决方案1】:

    这并不像你认为的那样:

    @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)
    

    &amp; 或多或少将符号转换为前面第一个示例中的{ |item| item.end_datetime } 块。

    【讨论】:

    • 是来自 Ruby 可枚举文档:“返回枚举中的对象,该对象给出给定块的最大值。如果没有给出块,则返回一个枚举器。”
    • 谢谢,是的,它缺少 &。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 2021-06-06
    • 1970-01-01
    • 2019-10-14
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多