我有一个包含日期字段的数组。我想按日期字段对数组进行排序,但是在对其进行排序之后,将每天内的事件洗牌(但仍保持日期顺序):
@events = Event.order('date desc').shuffle....?
这是我想要的一个例子:
阵列:
[
Event 1 (Jan. 2),
Event 2 (Jan. 1),
Event 3 (Jan. 3),
Event 4 (Jan. 1),
Event 5 (Jan. 3)
]
在一个请求中,我想要这个订单:
Event 2, Event 4, Event 1, Event 3, Event 5
但是,在另一个请求中,有一个不同的随机顺序:
Event 4, Event 2, Event 1, Event 5, Event 3
在每个请求中,我想要一个类似的变体来维护日期顺序,但是每天都会对事件进行洗牌。
答案 0 :(得分:2)
试试这个:
@events = Event.order("date, random()")
这将在同一日期内提供事件的随机排序。
答案 1 :(得分:1)
假设events
是一个已按日期排序的可枚举,您可以执行类似
events.chunk {|event| event.date.to_date}.flat_map do |(_date, elements)|
elements.shuffle
end
chunk
对块返回相同值的连续元素进行分组。它返回一组块值(块中的返回元素)和相应的数组值。然后你需要做的就是洗掉那些块。