2016-05-20 8 views
1

日付フィールドを持つイベントがいっぱいの配列があります。私は、日付フィールドで配列をソートしたかったが、これがソートされた後、次に、それぞれの日内のイベントをシャッフル(まだ日付順を維持する):日付で並べ替え、日付内でシャッフルする方法

@events = Event.order('date desc').shuffle....? 

これは私が何をしたいの例です。

アレイ:1つの要求に

[ 
    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 

各要求で、私は日付順を維持するが、それぞれの日内のイベントをシャッフル同様のバリエーションが欲しいです。これは、同じ日付内のイベントのランダムな順序を提供します

@events = Event.order("date, random()") 

+0

シャッフルすると、すぐに注文権が失われますので、 'Event.all.shuffle.sort_by(&:date)'のようなことをしようとしますが、ここにすべてのイベントを照会することに気をつけてください。 –

+0

ありがとう、manuel。これを試してみましたが、ソート/オーダーの前に条件があるため動作しません。他の提案はありますか? – gitastic

+0

あなたの努力の証拠を見ることを期待するとき。それがなければ、コードがあなたのために書かれているように見えるように見えますが、それはSOのためではありません。 –

答えて

2

はこれを試してみてください。 eventsを想定し

+0

これはまさに私が必要としているようですが、このエラーが発生します:PG :: GroupingError:ERROR:列 "events.id"はGROUP BY句に現われなければならないか、集約関数で使用される必要があります – gitastic

+0

助けてくれたmichaelに感謝します! PG :: UndefinedFunction:エラー:関数random(整数)が存在しません – gitastic

+0

私はこれを試して、動作しているようです:Event.group( "events.id" ).order( "date、random()") - あなたの答えを編集したい場合は、私は受け入れます、あなたは最も近いです! – gitastic

1

は、すでにあなたはブロックが同じ値を返すため

events.chunk {|event| event.date.to_date}.flat_map do |(_date, elements)| 
    elements.shuffle 
end 

chunkグループの連続した要素のような何かを行うことができます日付順に列挙可能です。チャンク値(ブロックからの戻り要素)と対応する配列値のペアの配列を返します。それからあなたがする必要があるのは、それらのチャンクをシャッフルすることだけです。

関連する問題