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

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

person Phil_Ken_Sebben    schedule 02.11.2010    source источник


Ответы (1)


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

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' }
}
person Phil_Ken_Sebben    schedule 03.11.2010