我有一个查询,查找给定日期@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的顺序无关紧要 - 我只想要最大值。我在这做错了什么?感谢。
答案 0 :(得分: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 }
块。