1

whileこれを使用してランダムなマッチアップを選択し、その結果をテストして、ループの基準を満たすまでランダムなマッチアップを描画します。

m = Matchup.order("RANDOM()").first

ループはbreak10 サイクル後に設定され (無限ループを避けるため)、任意にループから抜け出し、ログをチェックして、ループを通過するたびにマッチアップが同じであることを確認します。ループの単純化されたバージョンは次のようになります。

counter = 0
while counter < 5
    m = Matchup.order("RANDOM()").first
    logger.debug('Matchup ID: ' + m.id)
    counter += 1
end

ログは次のようになります。

Matchup ID: 7
Matchup ID: 7
Matchup ID: 7
Matchup ID: 7
Matchup ID: 7

m = Matchup.order("RANDOM()").first別のマッチアップを恣意的にプルしないのはなぜですか? 最も奇妙な部分は、問題なく動作することもあれば、b/cmが変化しないループでスタックすることもあります。助言がありますか?

実際のループを見たい場合は、ここ (getRandomMatchup関数内) で見ることができます: https://github.com/jackerman09/wdis/blob/master/app/controllers/static_pages_controller.rb

4

3 に答える 3

1

このモデルが通常の ActiveRecord モデルであると仮定すると、次のようなものを試すことができます。

max_id = Matchup.maximum(:id)
id = rand(max_id)
m = Matchup.find(id)
...

そうすることで、データベースにランダムに並べられたレコードを取得するように依頼するよりもコストがかからない場合があります。ただし、このアプローチの欠点は、レコードが削除されるMatchup.find(id)可能性があることnilです。

これを行う別のより良い方法は次のとおりです。

ids = Matchup.pluck(:id)
m = Matchup.find(ids[rand(ids.length)])
于 2013-10-15T14:46:39.897 に答える