Я пытаюсь найти дополнение, используя ActiveRecord и / или SQL.
У меня есть коллекция «аннотаций», каждое из которых имеет два соответствующих поля:
- session_datum_id, которое соответствует пользователю, который выполнил аннотацию.Нуль означает, что это еще не сделано.
- post_id, который представляет пост, в котором аннотация "о".Не может быть нулевым.
Возможно, существует несколько аннотаций для post_id.
Я хотел бы эффективно найти аннотацию, которая удовлетворяет двум ограничениям:
- session_datum_id равен нулю.Это означает, что данная конкретная аннотация еще не была выполнена.
- параметр session_datum, переданный как аргумент arg, еще не выполнил другую аннотацию с тем же post_id.
Вот очень наивная версия, которая делает соединение вне БД.Он находит все аннотации, которые этот пользователь уже выполнил, и удаляет те post_ids из исчерпывающего списка аннотаций, которые еще необходимо выполнить.Затем он выбирает случайным образом из результирующего списка:
def self.random_empty_unseen(session_datum)
mine = where('session_datum_id = ?', session_datum)
elligible = where('session_datum_id IS NULL')
mine.each do |i|
elligible.each do |j|
if (i.post_id == j.post_id)
elligible.delete(j)
end
end
end
elligible[rand(elligible.count)]
end
Поскольку список аннотаций становится большим, это ужасно затухает.Я могу представить вероятностный алгоритм, в котором мы выбираем случайную заметную аннотацию, а затем проверяем, выполнил ли пользователь ее уже (повторная попытка, если так), но существуют вырожденные случаи, когда это не сработает.(Большое количество аннотаций, и пользователь выполнил все, кроме одной.)
Есть ли для этого запрос в закрытой форме, возможно, с использованием NOT EXISTS?