特定のユーザーが(Rails 3で)読んだ投稿を追跡するモデルを構築しています。これを追跡するテーブルは「測定値」です。読み取り値は:userと:postの両方に属します。どちらもhas_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)
}