2012-06-14 46 views
1

我使用each_slice從ActiveRecord列表中以網格格式顯示記錄。我想要做的是隨機插入項目到這個網格。如何在each_slice的Rails模型列表中插入額外的對象

我的代碼目前看起來是這樣:

<%=things.each_slice(3) do |row|%> 
    <div class="row"> 
    <%row.each do |listing|%> 
     <%=show_cell(listing)%> 
    <%end%> 
    </div> 
<%end%> 

其產生的電網,像這樣:

+----+----+----+ 
|cell|cell|cell| 
+----+----+----+ 
|cell|cell|cell| 
+----+----+----+ 
|cell|cell|cell| 
+----+----+----+ 

我想要做的是有像

+----+----+----+ 
|cell|cell|cell| 
+----+----+----+ 
|cell|xxxx|cell| 
+----+----+----+ 
|cell|cell|xxxx| 
+----+----+----+ 

凡細胞來自記錄的事物集合,並且xxxx被隨機插入(10%機率)

有沒有一種「紅寶石」的方式做到這一點,而沒有擺脫切片方法,並手動保持創建新行的時間計數?

+0

嘗試each_slice之前追加洗牌方法。 – MurifoX

+0

「10%的機會」是有道理的。 – tokland

回答

1

使混合物聯網和XXXS的新數組:

mixed_stuff = things.to_a.collect {|t| rand > 0.9 ? t : [t, xxx] }.flatten 

然後,你可以這樣做:

<%= mixed_stuff.each_slice(3)做|行|%>等...

然後在show_cell(上市)方法,你可以做if listing.is_a?(Thing)... else listing.is_a?(Xxx)...

2

這?

>> (1..10).flat_map { |x| rand > 0.1 ? [x] : [x, "xxxx"] } 
=> [1, "xxxx", 2, 3, 4, 5, 6, "xxxx", 7, 8, 9, 10] 
+0

希望我能回答這個和stef's都是對的。不幸的是,我不能。 – seanyboy

-2

編輯:這不起作用隨機隱藏的物品,而不是

來處理這一個更清潔的方式之間
<%= rand>0.9 ? 'xxxxx' : show_cell(listing)%> 
+0

是的,這是錯誤的,誤解了這個問題 – fringd

0

是使隨機提供了一個枚舉插入佔位符「XXX」。這裏是我的刺在那...

潛在的問題:

  • 假設連續XXX的是確定
  • 如果總數不通過任何3分多什麼?

反正,這裏是

class Randomizer 
    include Enumerable 

    def initialize(source) 
    @source = source 
    end 

    def each 
    @source.each do |*args| 
     while rand < 0.1 
     yield 'xxx' 
     end 
     yield(*args) 
    end 
    while rand < 0.1 
     yield 'xxx' 
    end 
    end 
end 

words = %w{foo bar baz bing bang boom} 
Randomizer.new(words).each_slice(3) do |row| 
    row.each do |word| 
    print "#{word} " 
    end 
    puts '' 
end 
相關問題