0

我有一个查询查找给定日期@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 的顺序并不重要——我只想要最大值。我在这里做错了什么?谢谢。

4

1 回答 1

2

这不会像您认为的那样做:

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

于 2013-06-17T15:20:49.663 回答