diff --git a/app/models/message.rb b/app/models/message.rb new file mode 100644 --- /dev/null +++ b/app/models/message.rb @@ -0,0 +1,60 @@ +class Message < ActiveRecord::Base + + belongs_to :sender, :class_name => "User" + belongs_to :receiver, :class_name => "User" + + belongs_to :replying_message, :class_name => "Message" + + # commented manually do it + # + #has_many :replied_messages, { + # :class_name => "Message", + # :foreign_key => "replying_message_id" + #} + # + + attr_accessor :replied_messages + + def self.find_all_sent_by_user(user) + messages = user.messages + replied_messages = user.replied_messages + Message.build_replying_message_hierarchy messages, replied_messages + return messages + end + + def self.find_all_system_unreplied_messages + self.find(:all, + :conditions => 'ISNULL(receiver_id) ' + + 'AND (ISNULL(replied) OR replied=0)', + :order => 'created_at') + end + + def self.build_replying_message_hierarchy(*args) + # manually build replies hierarchy (to improve efficiency) + all_messages = {} + + args.each do |collection| + collection.each do |m| + all_messages[m.id] = m + m.replied_messages = [] + end + end + + all_messages.each_value do |m| + rep_id = m.replying_message_id + if all_messages[rep_id]!=nil + all_messages[rep_id].add_replied_message(m) + end + end + end + + def add_replied_message(m) + if @replied_messages==nil + @replied_messages = [m] + else + @replied_messages << m + end + @replied_messages + end + +end