如何按日期排序,然后在日期内随机播放

时间:2016-05-20 21:48:54

标签: arrays ruby sorting activerecord

我有一个包含日期字段的数组。我想按日期字段对数组进行排序,但是在对其进行排序之后,将每天内的事件洗牌(但仍保持日期顺序):

@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

在每个请求中,我想要一个类似的变体来维护日期顺序,但是每天都会对事件进行洗牌。

2 个答案:

答案 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对块返回相同值的连续元素进行分组。它返回一组块值(块中的返回元素)和相应的数组值。然后你需要做的就是洗掉那些块。