will_paginateを使用して、ブログ投稿のランダムリストをページ分割します。
-
03-07-2019 - |
質問
ユーザーにブログの投稿をランダムにページングできるようにしたい
このように実装することはできません:
@posts = Post.paginate :page => params[:page], :order => 'RANDOM()'
すべてのクエリで:order
パラメータが呼び出されるため、ブログの投稿を繰り返すリスクがあります。
これを行う最良の方法は何ですか?
解決
RANDはMySQLのシードを受け入れます:
RAND(N)
MySQLドキュメントから:
RAND()、RAND(N)
ランダムな浮動小数点値を返します v範囲0 <!> lt; = v <!> lt; 1.0。もし 定数整数引数Nは 指定され、シードとして使用されます 反復可能な値を生成する値 列値のシーケンス。の中に 次の例では、RAND(3)によって生成される値のシーケンスは、発生する両方の場所で同じであることに注意してください。
他のデータベースにも同様の機能が必要です。
RANDを呼び出すたびに Same シードを使用すると、リクエスト全体で順序が一致し、それに応じてページ分割することができます。
その後、ユーザーのセッションにシードを保存できます。これにより、各ユーザーに固有の結果セットが表示されます。
他のヒント
各ページ(新しいリクエストから生成される)が潜在的に繰り返し投稿されるのを避けるために、複数のリクエストを取得するために投稿の順序をどこかに保存する必要があります。
各ユーザーに一意のランダムな順序を持たせたい場合は、IDのセッション配列に順序を保存します。
すべてのユーザーが同じランダムな順序を気にしない場合は、投稿テーブルに位置列があります。
次のことができます:order = <!> gt;元のクエリで@postsを生成するRANDOM()を使用します。ページ分割する場合は、順序を指定しないでください。
ランダムな動作をカプセル化するPostモデルで名前付きスコープを作成します:
class Post < ActiveRecord::Base
named_scope :random, :order => 'RANDOM()'
.
.
.
end
あなたのPostsController
コードは次のようになります:
@posts = Post.random.paginate :page => params[:page]