Я создаю модель, которая отслеживает сообщения, которые прочитал данный пользователь (в Rails 3). Таблица, которая отслеживает это, называется «чтения». чтение принадлежит как :user, так и :post, оба имеют_many :readings. Когда пользователь видит сообщение, оно помечается как прочитанное, и создается «чтение» с 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)
}
Однако мои попытки вернуть дополнение к этому набору (непрочитанные посты) не увенчались успехом. Как это может быть сделано? Есть ли общий способ написать область (метод), которая просто возвращает дополнение к другому (здесь: :read)? Я также был бы рад написать это как метод класса, который работает так же, как область видимости.
Имейте в виду, что чтения создаются только тогда, когда сообщение прочитано, поэтому у нового сообщения не будет никаких показаний. Это казалось более экономичным, чем создание записей для каждого пользователя для каждого нового поста.
РЕДАКТИРОВАТЬ: ОК, я приближаюсь - приведенная ниже область почти работает, но не требует, чтобы все показания для сообщения не равнялись 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)
}