2014-12-02 49 views
0

在我的Rails應用程序中,我想選擇模型的三個隨機實例並將它們呈現在頁面上。 Model.order('RANDOM()').limit(3)的作品,但顯然,一旦數據庫表中包含大量數據,它將嚴重影響加載時間,所以我正在尋找一些不僅僅是開發中的東西。Postgres從行中選擇3個隨機模型實例?

這裏的線在我的Rails視圖現在:

<% featured = Product.order('RANDOM()').limit(3).where.not(photo_file_name: nil, sold_value: true) %> 

回答

0

有多種方式,你可以做到這一點。哪種方式最好是取決於你的設置,產品數量,等等,等等

ids = Product.pluck(:id).shuffle.slice(0,3) 
featured = Product.where(id: ids) 

只有兩個查詢,但如果你有一百萬的產品,這是一個很大返回,並在Ruby中洗牌。在進行第二次呼叫之前,可以刪除所選ID中的一個小競賽條件。

total = Product.count 
featured = 3.times.map { Product.offset(rand(total).first } 

四個查詢,但最後三個是有效的。我的語法可能已關閉,並且可能會有錯誤,請仔細檢查rand(total)返回零或total時會發生什麼。另外,對於一些數據庫Product.count可能真的是效率低下。