Я строю модель, которая отслеживает сообщения, прочитанные данным пользователем (в 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)
}