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| 
+----+----+----+

セルがレコードのthingsコレクションから取得され、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) do |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 に答える