2009-07-30 68 views
2

如何在使用group時獲得隨機記錄?Rails,使用時獲取隨機記錄:組

@paintings = Painting.all(:group => "user_id", :order => "created_at DESC") 

這給了我最新的繪畫爲每個用戶。現在我想從每個用戶中選擇一張隨機的繪畫,而不是最新的。繪畫的順序應該是相同的,以便最活躍的用戶首先顯示他/她的隨機繪畫。

painting150(用戶1)
painting200(用戶2)
painting231(用戶3)

這可能嗎?

此致敬禮。 AsbjørnMorell。

回答

1

這個答案是特定於Rails的,但是因爲你使用的是ActiveRecord,所以我是一個假裝它應該沒問題。

unique_paintings = [] 
@paintings.group_by(&:user_id).each do |user_id, paintings| 
    unique_paintings << paintings[rand(paintings.size-1)] 
end 

unique_paintings.sort_by(&:created_at) 

的GROUP_BY肯定打亂了你在查詢做了created_at排序,所以我做了sort_by作爲最後一步。您可能希望在查詢中擺脫它,因爲您無論如何都必須在此處執行此操作。

0
@painting = @paintings[rand(@paintings.size-1)] 

(或paintings.count,不知道的還正確的方法)

+0

我應該在我看來用這個嗎? – atmorell 2009-07-30 13:04:12

+2

此示例僅返回一個隨機圖像...即使@paintings包含100條記錄。 – atmorell 2009-07-30 13:05:29

0

假設你有MySQL,你可以嘗試:

@paintings = Painting.all(:group => "user_id", :order => "RAND()") 
+0

這總是爲每個用戶返回相同的記錄,但以隨機順序:/我需要爲每個用戶返回一張隨機的繪畫。 – atmorell 2009-07-30 14:03:16

0

你可以做這樣的事情,但它會遭受隨着你的記錄數增長

@paintings = Painting.find(:all, :order => 'RAND()').map{ |i| i.user_id }.uniq