2011-06-19 36 views
4

我目前使用:更好的方式隨機化(的Ruby/Rails 3)

@users = User.order( 「RANDOM()」)的限制(6)

到。生成6個隨機用戶的列表 - 但是,此方法在頁面加載時間上需要1200毫秒的收費。有沒有更快/更有效的方式來調用6個隨機用戶?

+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

我結束了使用這裏所描述的方法的一個頁面查詢: Rails select random record

@ramc - 感謝您的評論。加載時間現在快得多:)

-2

你可以嘗試使用數組洗牌,而不是用mysql隨機的,因爲它可能會很慢:

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

畢竟,ActiveRecord對象的集合,目前還只是一個數組

+0

這段代碼是有效的,但加載時間是相同的。 :( – neon

+0

這也加載了整個用戶集合 - 隨着用戶記錄數量的增加,性能將會變差 – theTRON

+0

加載整個集合並不是你想要做的,如果數據庫做了它,你不需要獲取每一行。 – Schmurfy

0

假設自動遞增的ID,從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

您可以改爲隨機選擇一個用戶頁面。考慮使用Kaminari

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

這這個分頁調用將觸發一個計數的查詢和6個用戶