require 'active_record' module Helicoid module Acts #:nodoc: module Messenger #:nodoc: def self.included(mod) mod.extend(ClassMethods) end module ClassMethods def acts_as_messenger(options = {}) options[:join_table] ||= "messages_#{self.table_name}" options[:foreign_key] ||= self.name.to_s.foreign_key write_inheritable_attribute(:message_foreign_key, 'message_id') write_inheritable_attribute(:messaged_foreign_key, options[:foreign_key]) write_inheritable_attribute(:message_model, 'Message'.constantize) write_inheritable_attribute(:messages_join_table, options[:join_table]) class_eval do extend Helicoid::Acts::Messenger::SingletonMethods class_inheritable_reader :message_model, :messages_join_table, :message_foreign_key, :messaged_foreign_key has_and_belongs_to_many :messages, :join_table => options[:join_table], :foreign_key => options[:foreign_key] end include Helicoid::Acts::Messenger::InstanceMethods end end module SingletonMethods end # Adds instance methods. module InstanceMethods def unread_messages unread_sql = '' read = self.messages unread_sql = ", #{messages_join_table} WHERE messages.id NOT IN (#{read.collect {|message| message.id }.join(',')})" if read.size > 0 sql = "SELECT messages.* FROM messages" + unread_sql + ' ORDER BY created_on DESC' message_model.find_by_sql(sql) end def read_messages messages.find(:all, :order => 'created_on') end def mark_as_read(message_id) self.messages << message_model.find(message_id) end end end end end ActiveRecord::Base.class_eval do include Helicoid::Acts::Messenger end