То, что у вас здесь есть, выглядит хорошо, но есть несколько вариантов, чтобы очистить его.
Скорее всего, вы никогда не захотите создать сообщение без отправителя и получателя? В этом случае вы можете перегрузить новую функцию в сообщении, чтобы получить все параметры, например:
@message = Message.new(params[:message], params[:sender_id], params[:receiver_id])
А затем создайте средство проверки before_save, которое проверяет действительность идентификаторов и создает записи ассоциации.
Если вы не хотите переопределять новую функцию, вы можете также создать в сообщении функции для принятия sender_id и receive_id, например
@message = Message.new()
@message.sender_id = params[:sender_id]
И снова используйте before_save для проверки и создания записей.
Наконец, другой вариант - использовать некоторую комбинацию ассоциаций модели: has_many,: has_one,: own_to или: has_many_through, чтобы обработать все для вас. Особенно мощный, когда вы используете named_scopes.