あなたはこれについてどう思いますか?
[ Friend, Colleague, Business, Office ].each do |klass|
klass.find(:first, :offset => (klass.count * rand).to_i, :limit => 1)
end
これは、すべての子モデルから1つのエントリをフェッチします。これは非常に高速であってもよいが、作品ではないでしょう:)
あなたは2回の繰り返しが必要な場合に、あなたはブロック全体をラップすることができます。
2.times do
end
しかし、モデルのその順番を意識するが、ここで固定されています。 。
prev = nil
10.times do
klass = [ Friend, Colleague, Business, Office ].reject { |k| k == prev }.shuffle.first
p klass.find(:first, :offset => (klass.count * rand).to_i, :limit => 1)
prev = klass
end
更新:あなたは、ランダムにも必要な場合は好奇心のために
を私はそのための小さな方法を作りました。 SQLiteを使用している場合は、RAND()
をRANDOM()
に置き換える必要があることに注意してください。また、this questionも確認してください。
def get_random_items(classes, count)
# collect at least count/2 random items from each class
items = Hash.new do |hash,klass|
hash[klass] = klass.find(:all, :order => "RAND()", :limit => (count.to_f/2).ceil)
end
results = []
prev = nil
while (classes.length > 0 && results.length < count) do
klass = classes.shuffle!.pop
item = items[klass].pop
next unless item
classes << prev if prev
prev = (items[klass].length > 0) ? klass : nil
results << item
end
results
end
使用法:get_random_items([ Friend, Colleague, Business, Office ], 10)
他よりも1からより多くがある場合はどのような。たとえば、「友人」よりも「友人」の方が多いでしょうか? –
これは、友人モデルからのレコードの取得を停止します。 –
ですので、ランダムな順序であり、完全にランダムではありません –