Дополнить в ActiveRecord? - PullRequest
       11

Дополнить в ActiveRecord?

1 голос
/ 03 октября 2011

Я пытаюсь найти дополнение, используя ActiveRecord и / или SQL.

У меня есть коллекция «аннотаций», каждое из которых имеет два соответствующих поля:

  • session_datum_id, которое соответствует пользователю, который выполнил аннотацию.Нуль означает, что это еще не сделано.
  • post_id, который представляет пост, в котором аннотация "о".Не может быть нулевым.

Возможно, существует несколько аннотаций для post_id.

Я хотел бы эффективно найти аннотацию, которая удовлетворяет двум ограничениям:

  1. session_datum_id равен нулю.Это означает, что данная конкретная аннотация еще не была выполнена.
  2. параметр 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?

1 Ответ

1 голос
/ 10 марта 2012
SELECT a1.*
FROM annotations AS a1
JOIN annotations AS a2
ON a1.post_id=a2.post_id
WHERE a2.session_datum_id=session_datum AND a1.session_datum_id IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...