module PrivateMessages module HasPrivateMessage extend ActiveSupport::Concern included do end module ClassMethods # Sets up a model have private messages, defining the child class as specified in :class_name (typically "Messages"). # Provided the following instance messages: # * sent_messages - returns a collection of messages for which this object is the sender. # * received_messages - returns a collection of messages for which this object is the recipient. def has_private_message(options = {}) options[:class_name] ||= 'Message' unless included_modules.include? InstanceMethods class_attribute :options table_name = options[:class_name].constantize.table_name has_many :sent_messages, -> { where("#{table_name}.sender_deleted = false").order("#{table_name}.created_at DESC") }, :class_name => options[:class_name], :foreign_key => 'sender_id' #:includes => :recipient, # #.order("#{table_name}.created_at DESC") #:order => "#{table_name}.created_at DESC", #:conditions => ["#{table_name}.sender_deleted = ?", false] has_many :received_messages, ->{ where("#{table_name}.recipient_deleted = false").order("#{table_name}.created_at DESC") }, :class_name => options[:class_name], :foreign_key => 'recipient_id' #, -> #{ # :includes => :sender, # :order => "#{table_name}.created_at DESC", # :conditions => [, false] #} #extend ClassMethods include InstanceMethods end self.options = options end end #module ClassMethods #:nodoc: # None yet... #end module InstanceMethods # Returns true or false based on if this user has any unread messages def unread_messages? unread_message_count > 0 ? true : false end # Returns the number of unread messages for this user def unread_message_count eval options[:class_name] + '.count(:conditions => ["recipient_id = ? AND read_at IS NULL and recipient_deleted = ?", self, false])' end end end end ActiveRecord::Base.send :include, PrivateMessages::HasPrivateMessage