получить дополнение области в rails / области, которая отфильтровывает совпадающие записи - PullRequest
0 голосов
/ 02 ноября 2010

Я строю модель, которая отслеживает сообщения, прочитанные данным пользователем (в Rails 3).Таблица, которая отслеживает это «чтения».чтение принадлежит как пользователю, так и: посту, оба из которых имеют значение: чтение.Когда пользователь видит сообщение, оно помечается как прочитанное, и с помощью user_id и post_id создается «чтение».Кажется, это работает нормально, но сейчас я пытаюсь написать область, которая возвращает только непрочитанные сообщения для данного пользователя.Поиск прочитанных сообщений работает нормально:

scope :read, lambda { |user_id = nil |       
    user_id.nil? ? {} : joins(:readings).where('readings.user_id = :user_id', :user_id => user_id)
}

Однако мои попытки вернуть дополнение этого набора (непрочитанные сообщения) проваливаются.Как это может быть сделано?Есть ли общий способ написать область (метод), который просто возвращает дополнение другого (здесь: чтение)?Я также был бы рад написать это как метод класса, который работает так же, как область видимости.

Имейте в виду, что показания создаются только при прочтении сообщения, поэтому новое сообщение не будет иметь показаний.Это казалось более экономичным, чем создание записей для каждого пользователя для каждого нового сообщения.

РЕДАКТИРОВАТЬ: ОК, я все ближе - нижеприведенная область почти работает, но не требует, чтобы все показания для сообщения не были равныИдентификатор пользователя.Таким образом, если пользователь # 1 прочитал сообщение, как и пользователь # 2, то запрашивается другое чтение и обнаруживается, что оно не равно.Таким образом, сообщение ошибочно признано непрочитанным.

scope :unread, lambda { |user_id = nil |       
    user_id.nil? ? {} : includes(:readings).where('(readings.user_id IS NULL OR readings.user_id != :user_id)', :user_id => user_id)
}

1 Ответ

0 голосов
/ 03 ноября 2010

Ну, похоже, что ниже работает.Все еще тестирую все же.Если кто-то найдет здесь дыру, с удовольствием открою заново.

scope :unread_by, lambda { |user_id = nil, hide_unread = nil|
      { :joins => "LEFT JOIN readings ON  readings.post_id    = post.id
          AND readings.user_id        = #{user_id}",
          :conditions => 'readings.id IS NULL' }
}
...