2009-07-30 15 views
2

グループを使用するとランダムなレコードを取得するにはどうすればよいですか?Rails、使用時にランダムなレコードを取得する:group

@paintings = Painting.all(:group => "user_id", :order => "created_at DESC") 

これにより、各ユーザーの最新の絵が得られます。今は、最新のものではなく、各ユーザーからランダムな絵を選択したいと思います。絵画の順番は同じでなければならないので、最も活発になったユーザーは最初にランダムな絵を表示します。

painting150(USER1)
painting200(USER2)
painting231(ユーザー3)

これは可能ですか?

よろしくお願いいたします。 AsbjørnMorell。

答えて

1

この回答はRailsに固有ですが、ActiveRecordを使用しているので、私はそれはうまくいくはずです。

unique_paintings = [] 
@paintings.group_by(&:user_id).each do |user_id, paintings| 
    unique_paintings << paintings[rand(paintings.size-1)] 
end 

unique_paintings.sort_by(&:created_at) 

GROUP_BYは最も確かにクエリでやったのcreated_at並べ替えを台無しので、私は最後のステップとして、sort_byをしました。あなたはここでそれをやらなければならないので、クエリでそれを取り除きたいかもしれません。

0
@painting = @paintings[rand(@paintings.size-1)] 

(またはpaintings.count、まだ右の方法を知らない)

+0

これは私の見解で使うべきでしょうか? – atmorell

+2

この例では、1つのランダムイメージのみが返されます。@ paintingsに100個のレコードが含まれていても。 – atmorell

0

MySQLを持っていると仮定すると、あなたは試すことができます:

@paintings = Painting.all(:group => "user_id", :order => "RAND()") 
+0

これは、常に各ユーザーに対して同じレコードを返しますが、ランダムな順序で返します。/各ユーザーごとにランダムなペイントを返す必要があります。 – atmorell

0

あなたはこのような何かを行うことができますが、それは苦しむことになりますあなたのレコード数が増えるにつれて

+0

あなたの例が最新の絵のユーザーIDを返すようです。 >> @paintings = Painting.all.map {| i | i.user_id} .uniq ペインティング負荷(46.6ms)SELECT * FROM 'paintings' => [3,4,5,6,7,8,9,10] – atmorell

関連する問題