2011-08-07 95 views
1

如何爲每個用戶選擇一個隨機記錄,但是按最新的記錄pr排序陣列。用戶。幫助將Rails 2數據庫邏輯轉換爲Rails 3.1/PostgreSQL

如果Foo上傳新的繪畫,我想從foo中選擇一個隨機記錄。通過這種方式,上傳10幅作品的用戶不會獨佔首頁上的所有空間,但仍然可以在頁面頂部獲得插槽。

這就是我在MySQL上運行Rails 2.x的方式。

@paintings = Painting.all.reverse 
first_paintings = [] 
@paintings.group_by(&:user_id).each do |user_id, paintings| 
    first_paintings << paintings[rand(paintings.size-1)] 
end 
@paintings = (first_paintings + (Painting.all - first_paintings).reverse).paginate(:per_page => 9, :page => params[:page]) 

上面的示例生成了很多SQL查詢,並且進行了適當的嚴格優化。如何在Rails 3.1上運行PostgreSQL?我有7000條記錄..

回答

1

@paintings = Painting.all.reverse = @paintings = Painting.order("id desc")

如果你真的想扭轉畫的順序結果集我會成立一個範圍,然後只需要使用

喜歡的東西

class Painting < ActiveRecord::Base 
    scope :reversed, order("id desc") 
end 

然後你可以使用Painting.reversed任何你需要它

+0

我想你的意思是'''Painting.reversed'''的用法。 –

+0

大聲笑:)謝謝,糾正! – jamesc

+0

沒問題,很樂意幫忙。 –

0

你可以ü SE中的動態查找器:

Painting.order("id desc").find_by_user_id!(user.id) 

這是假設你的作品表中包含user_id列或一些其他的方式給用戶,它似乎已覆蓋既然你在你最初的代碼中調用USER_ID畫作關聯。這不是隨機的,但使用find_all_by_user_id將允許您在陣列上調用.reverse,如果您仍想要並找到隨機繪畫。

+0

對不起,我需要一個隨機記錄公關。用戶。否則頁面會感覺到靜態。 – atmorell

+0

因此,使用他的動態查找器將所有繪畫拉回來,然後調用rand()。 –

1

你肯定設置了belongs_to商會在Painting模式,所以我會做:

# painting.rb 
default_scope order('id DESC') 

# paintings_controller.rb 
first_paintings = User.includes(:paintings).collect do |user| 
    user.paintings.sample 
end 
@paintings = (first_paintings + Painting.where('id NOT IN (?)', first_paintings)).paginate(:per_page => 9, :page => params[:page]) 

我覺得這個解決方案導致最少的SQL查詢,可讀性很強。沒有測試過,但我希望你明白了。

+0

你的例子似乎有一個小問題:NoMethodError:未定義的方法'paginate'爲#查詢的數量看起來不錯,雖然:) – atmorell