2011-06-19 20 views
4

:。へより良い方法(ルビー/ Railsの3)

@users = User.order( "RANDOMを()")リミット(6)

6人のランダムなユーザーのリストを生成しますが、この方法ではページの読み込み時間が1200ミリ秒になります。 6人のランダムなユーザーを呼び出すためのより高速で効率的な方法がありますか?それが遅くなることとしてはMySQLランダム使って配列のシャッフルを使用しての代わりに、試みることができる

+0

http://stackoverflow.com/questions/2279706/select-random-row-from-an-sqlite-table/4740561#4740561のようなものはありますか? – captainpete

+1

あなたはこれを考慮しました:http://stackoverflow.com/questions/3641057/rails-select-random-record/3641112#3641112 – dexter

答えて

1

のページに1つのクエリ発生しますKaminari

User.order('created_at').page(rand(User.count)).per(6) 

を使用して、このページネーション呼び出しを考えてみましょう: Rails select random record

@ramcを - ご意見ありがとうございます。読み込み時間がずっと速くなりました:)

-2

:すべての後に

@users = User.all.shuffle[0..5] 

を、ActiveRecordのオブジェクトのコレクションは、まだ自動インクリメントIDを想定すると、単にアレイ

+0

このコードは有効ですが、読み込み時間は同じです。 : – neon

+0

これは、Userコレクション全体を読み込みます。ユーザーレコードの数が増えるにつれてパフォーマンスが悪化します。 – theTRON

+0

コレクション全体をロードすることはあなたがやりたいことではなく、データベースが実行する場合はすべての行をフェッチする必要はありません。 – Schmurfy

0

あり、 0から始まり、そのユーザーオブジェクトが削除されることはありません、以下は非常に高速である必要があります:

@users = (0..5).map { User.find(rand * User.count) }

+0

また、User.countの結果をキャッシュする方が速いでしょう。簡潔で分かりやすくするために除外されています。 – Redbeard

0

Hあなたはランダムなオフセットを使用しようとしました&制限?

class User < ActiveRecord::Base 

    def self.random num = 1 
    num.times.map { offset(rand(count)).limit(1) } 
    end 

end 

@users = User.random(6) 

ARから単一のランダムインスタンスを取得するのに似たようなものを使用しました。独自の結果を保証したい場合は、少しスマートにする必要があります。

0

代わりにユーザーのページをランダムに取得できます。これは、1つのカウントクエリと私はここで説明する方法使用して終了6人のユーザー

関連する問題