1

我正在使用 each_slice 从 ActiveRecord 列表中以网格格式显示记录。我想要做的是将项目随机插入到这个网格中。

我的代码目前看起来像:

<%=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% 的机会)

是否有一种“红宝石”方法可以做到这一点,而无需摆脱切片方法,并手动计算何时创建新行?

4

4 回答 4

2

这?

>> (1..10).flat_map { |x| rand > 0.1 ? [x] : [x, "xxxx"] }
=> [1, "xxxx", 2, 3, 4, 5, 6, "xxxx", 7, 8, 9, 10]
于 2012-06-14T13:33:13.023 回答
1

制作一组新的混合事物和 Xxx:

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

然后你可以这样做:

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

然后在 show_cell(listing) 方法中你可以做if listing.is_a?(Thing)... else listing.is_a?(Xxx)...

于 2012-06-14T13:32:21.687 回答
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
于 2012-06-18T21:10:36.407 回答
-2

编辑:这不起作用随机隐藏项目,而不是在两者之间插入占位符

<%= rand>0.9 ? 'xxxxx' : show_cell(listing)%>
于 2012-06-14T13:41:00.450 回答