2016-11-28 61 views
0

我有一個我想要洗牌的圖像數組,只顯示前十個結果。我無法弄清楚如何做到這一點。在導軌上重新排序紅寶石數組

這裏是我的代碼

<% @images.each.shuffle do |image| %> 
    <tr> 
    <td><%= image.name %></td> 
    <td> <%= image_tag image.picture.url %></td> 
    <td><%= image.likes %></td> 
    <td><%= link_to 'Show', image %></td> 
    <td><%= link_to 'Edit', edit_image_path(image) %></td> 
    <td><%= link_to 'Destroy', image, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
    </tr> 
<% end %> 
+0

是@ @圖像是AR代理對象還是什麼?如果是這樣,您可能需要調整您的查詢,以便它執行洗牌和限制DB端。即'@images = Image.where(...)。order(「rand()」)。limit(10)'。請注意,隨機排序不能使用索引,但它比將整個表加載到RAM應用程序端更好。這還有一個額外的好處,即將邏輯放在視圖之外,這是Rails的最佳實踐。 –

+0

@ChrisHeald,謝謝。我不得不做一點挖掘,但我在數據庫方面找到了答案。發佈你的答案,以便我可以給你信用 – Aaron

回答

2

您可以在Array類使用示例函數。

<% @images.to_a.sample(10) do |image| %> 
1

如果@images的AR代理對象或一些其他數據庫查詢的結果,您可能需要調整您的查詢,以便它的洗牌和限制DB-側:

@images = Image.where(...).order("rand()").limit(10) 

請注意,隨機排序不能使用索引,但它比將整個表加載到RAM應用程序端更好。類似這樣的:

@images = Image.where(...) 
@images.to_a.sample(10) 

會將整個查詢的結果加載到Rails應用程序的RAM中,這會很慢。

這還有一個額外的好處,即將邏輯放在視圖之外,這是Rails的最佳實踐。

(作爲每個提問者的請求的答案)