I'm wondering why the has_many :through? Your join model has no extra
attributes at all. Why not just
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