はい、これに対してLEFT OUTER JOINを使用できます。通常のINNER JOINには結合条件に一致する行のみが含まれ、LEFT JOINには一致する行が含まれ、すべての列にNULLを入れることで適合しない行が抽出されます(PostgreSQL docsは適切な説明があります)。
したがって、LEFT JOINを実行して、NULLを検索することで不一致の行を探します。 SQLは次のように表示されます:
select ...
from questions
left outer join user_questions on questions.id = user_questions.question_id
where user_questions.question_id is null
これは、あなたには答えられていないすべての質問を与えるでしょう。 ActiveRecordのでは、あなたがこのような何か行うことができます:
Question.joins('left outer join user_questions on question.id = user_questions.question_id')
.where(:user_questions => { :question_id => nil })
.limit(1)
をあなたにもランダムな順序で再生したいかもしれませんが、それはあなたが始める必要があります。それはあなたのマッチを与えるものではありませんなら、あなたはこのようなもので、ランダムな質問をつかむことができます:あなたが大規模なデータベースとの不快なことができるだけでなくQuestions.order('random()').limit(1)
しかしORDER BY random()
で上記の操作を行うことができ
n = Questions.count
q = Questions.offset(rand(n)).limit(1)
。数が非常に速くなければならないので、Rubyでのランダムピッキングをすばやく行うとデータベースが嫌になることはありません。
また、joins
を整理する方法についてはdocumentationをご覧ください。少し標準化されていない構造のデータベースを使用していますので、時には長い道のりが必要です。私がYMMVを綴らない限り、ActiveRecordは私のためにLEFT JOINを拒否しています。
異なるバージョンのSQLでは、異なるバージョンの 'RANDOM()'が必要なようですが、これはそうです。 – modernserf