2009-05-01 65 views
5

我想讓用戶能夠按照隨機順序翻閱我的博客文章。使用will_paginate通過隨機博客文章列表分頁

我無法實現這樣的:

@posts = Post.paginate :page => params[:page], :order => 'RANDOM()' 

因爲:order參數被稱爲與每個查詢,因此我重複的風險博客帖子。

這樣做的最好方法是什麼?

回答

3

RAND接受MySQL中的種子:)

RAND(,RAND(N)

返回一個隨機浮點值 V IN:

RAND(N) 

MySQL docs範圍0 < = v < 1.0。如果指定了 恆定整數參數N爲 ,則將其用作值 值,該值將生成可重複的 列值序列。在 下面的例子中,請注意由RAND(3)產生的值序列在兩個地方都是相同的。

其他數據庫應該具有類似的功能。

如果您在每次撥打RAND時使用SAME種子,則訂單在各個請求之間將保持一致,您可以相應進行分頁。

然後,您可以將種子存儲在用戶的會話中 - 這樣每個用戶將看到一組對他們唯一的結果。

+0

使用RANDOM()和種子的語法是什麼?我找不到它。 – 2009-05-06 03:23:05

0

您可以在您的原始查詢中填入@posts,然後在您分頁時不指定順序,您可以:order => RANDOM()。

-2

創建上發表你的模型named scope封裝的隨機行爲:

class Post < ActiveRecord::Base 
    named_scope :random, :order => 'RANDOM()' 
    . 
    . 
    . 
end 

PostsController代碼就變成了:

@posts = Post.random.paginate :page => params[:page] 
+0

這是行不通的 - 每次你都會得到一個隨機的30個(或者說你的頁面大小)。 – 2009-05-02 18:28:33

1

爲了避免每個頁面(從一個新的請求產生的)可能有一個重複的帖子,你需要存儲帖子的順序在多個請求檢索。

如果您希望每個用戶都擁有唯一的隨機訂單,然後將訂單保存在ID會話數組中。

如果您不介意具有相同隨機順序的所有用戶,則在posts表中有一個位置列。