module ActiveRecord module Acts module Readable def self.included(base) base.extend ClassMethods end module ClassMethods def acts_as_readable has_many :readings, :as => :readable has_many :users_who_read, :through => :readings, :source => :user include ActiveRecord::Acts::Readable::InstanceMethods extend ActiveRecord::Acts::Readable::SingletonMethods end end module SingletonMethods def find_unread_by(user) find(:all) - find_read_by(user) end def find_read_by(user) find(:all, :conditions => ["readings.readable_id = #{table_name}.id AND readings.user_id=?", user.id], :include => :readings) end end module InstanceMethods def read_by!(user) readings << Reading.new(:user_id => user.id) end def unread_by!(user) readings.find(:first, :conditions => ["user_id = ?",user.id]) end def read_by?(user) !!users_who_read.find(:first, :conditions => ["user_id = ?",user.id]) end end end end end