2011-03-17 54 views
7

因此,我的應用程序具有屬於Collections的照片。我希望能夠在頁面上顯示來自特定集合的13張照片。Rails:獲取特定數量的隨機記錄

我嘗試這樣做:

c = Collection.first 
@photos = c.photos.offset(rand(c.photos.count)).limit(13) 

這工作排序。問題是,如果收藏的照片數量不超過13張,則不一定會返回13張照片。我需要專門準確地獲取13張照片。

FWIW在我的應用程序的情況下,集合只能由管理員/ mod創建,所以我們可以強制任何集合都不會少於13張照片。我需要的是一旦有超過13張的照片,就可以隨機選擇照片。

我該怎麼做?

回答

13

你可以先選擇13周隨機相關照片的身份證,然後做一個數據庫查詢來接他們:

c = Collection.first 
random_ids = c.photo_ids.sort_by { rand }.slice(0, 13) 
@photos = Photo.where(:id => random_ids) 
+0

你的評論說「最多13張照片」,這將返回正確的13張照片?如果回報較少,我不能使用它。 – Andrew 2011-03-17 17:21:13

+0

那麼,如果集合少於13個photo_id,它就不能返回13張照片。否則,是的,它的確如此。 – 2011-03-17 17:23:26

+0

好的,經過測試,效果很好,謝謝! – Andrew 2011-03-17 19:37:53

6

只是在SQL隨機排序,他們採取的第一個13 這樣做:

c.photos.order("RAND()").limit(13) 
+0

是否在SQLite和PostgreSQL的這項工作:

module RandomRecordsHelper def random_user_ids(n) user_ids = [] user_count = User.count n.times{user_ids << rand(1..user_count)} return user_ids end 
控制器

?我對SQL不太擅長,但由於SQL的差異,我在開發和生產環境之間過去遇到過問題。 – Andrew 2011-03-17 17:19:35

+0

你可以隨時嘗試並找出答案。我非常確定'RAND()'在大多數SQL實現中都有效。 – tadman 2011-03-17 17:23:11

+4

注意,因爲它是INCREDIBLY效率低下的,在較大的數據集上執行所需的時間會比所需的時間長得多。 – nzifnab 2011-03-17 17:24:32

-1

下面是一個快速解決方案..目前使用它超過150萬條記錄,並獲得不俗的表現。最好的解決方案是緩存一個或多個隨機記錄集,然後以期望的時間間隔與後臺工作人員一起刷新它們。

創建random_records_helper.rb文件:

@users = User.where(id: random_user_ids(10))