2017-08-10 4 views
1

ランダムなトラックを選択しようとしていますが、特定のレコードとのマッチングを避ける必要があります。RailsでランダムなSQLクエリをキャッシュするのを防ぐ

これは私のコードですが、whileループが終了しないようにクエリのCACHEを返し続けます。

current_track = Track.find(10) 
random_track = Track.limit(1).order("RANDOM()").first 

while random_track == current_track 
    random_track = Track.limit(1).order("RANDOM()").first 
    Rails.logger.debug "getting another random one..." random_track 
end 

これを防ぐにはどうすればよいですか?

答えて

3

これは非常に奇妙なことですが、私にとってはローカルでは起こっていません。とにかく、あなたはすでに、単一のアイテムを取るlimit(1)firstようにする必要はありませんuncached

Track.uncached { Track.order("RANDOM()").first } 

注意を使用することができます。

ループも必要ありません。別のトラックを使用する

current_track = Track.find(10) 
random_track = Track.where("id <> ?", current_track.id).order("RANDOM()").first 

不要なコードをたくさん保存します。

+0

私はそれを使用する理由がないので、 'uncached'を使用しないことをお勧めします。何かが壊れています。 –

+0

ありがとう!それは完全に機能し、キャッシュされていない構文を知っているのは良いですが、私はwhereクエリを使う方が良いと完全に同意します! – Chris

1

これは私のために働く。デフォルトスコープやキャッシュを実行していますか?

ランダムクエリからcurrent_trackを除外することで、ループを回避できます。ループが一度も終了しないため、トラックが1つだけの場合でもソリューションは失敗します。

current_track = Track.find(3) 
random_track = Track.where.not(id: current_track).order("RANDOM()").first 

テーブルが大きくなると、RANDOM()の注文が高価になることがあります。

+0

申し訳ありません私はあなたのポストパスカル、私にそれを説明する時間を割いてくれてありがとう。私はすでにシモーヌの答えを正しいとマークしていたので、これをアップアップするだけです。 – Chris

+0

フィードバックのおかげで@chris!答えは同じです、ちょうどあなたが常に少なくとも2つのトラックを持っていることを確認してください.... –

関連する問題