thats exactly right, altough you could use a join model, too (via has_many :through) to be able to mark the message as read or deleted via the join (among other stuff).
Another option might be to use a decorated join model. soething like,
has_many :messages, :through => :communications
communications could have fields for message_id, recipient_id,
sender_id, date_sent, etc
also you could have a field type to store single table inheritance
information to know if a message is a post, comment or reply.