has_many :through

I'm wondering why the has_many :through? Your join model has no extra
attributes at all. Why not just

Message
   belongs_to :sender
   has_and_belongs_to_many :recipients

User
   has_many :sent_messages, :class_name => 'Message'
   has_and_belongs_to_many :received_messages, :class_name => 'Message'

This gives you all the scenarios you desired and appears to be much
simpler than the path you are currently going down. I'd love to hear
other options using has_many :through with more attributes on the
join model.

-Michael
http://javathehutt.blogspot.com