2011-06-18 80 views
3

我想弄清楚如何使範圍,將返回隨機ActiveRecords,同時也支持will_paginate。範圍隨機訂單與分頁

現在每個頁面視圖都會得到一個完全不同的隨機設置的ActiveRecords。因此,每個分頁鏈接實際上只是另一組隨機記錄。

我該如何設置一個範圍,以便它是一個隨機的順序,通過分頁持續存在?

我猜我需要某種基於時間的種子?

回答

2

我猜你在SQL中使用ORDER BY RAND()來得到你的隨機排序。如果是,那麼就可以提供一個seed for the random number generator

RAND(), RAND(N)

[...]如果指定恆定整數參數Ñ,它被用作種子值,其產生一個可重複的列值序列。

所以你只需要選擇一個種子(甚至可以使用seed = rand(1e6)或類似的Ruby代碼)並跟蹤會話中的種子。然後,對於下一頁,將種子拉出會話並將其提供給MySQL的RAND函數。

請記住ORDER BY RAND()(有或沒有種子)不是這個星球上最便宜的手術。如果您的可搜索表格很小,可以用一堆列生成一個表格,用隨機數填充(可能由RAND生成),然後將該表格加入以提供您的隨機序列以排序。您可以通過從隨機數字表中選擇不同的列來爲不同的觀看者提供不同的序列:對於按照隨機數字表格/矩陣第11列排序的一個用戶,但另一個用戶將使用第23列。請記住,表格關鍵)實際上只是有限域上的函數(反之亦然),所以你選擇的通常只是一個實現細節。使用表格實現RAND通常會非常麻煩,但我想我會提及選項。

+0

謝謝。這是超級有用的。蘭德()有多貴。我正在嘗試使用,以便我的活動Feed不僅僅是按時間順序排列。我希望人們碰到事情。有什麼建議麼? – Cyrus

+0

@Cyrus:通過'RAND(x)'(對於某些特定於用戶的'x')進行排序可能不錯,但如果開始出現數據庫性能問題,請記住看看那裏。您只需要某種方式將「x」與每個用戶相關聯,將其填入會話或URL中,或者在您的特定情況下執行任何操作。 –