Вы можете сделать это еще с group_by - вам просто нужно точно указать ключ, который вы используете для группировки.Поскольку вас не волнует направленность сообщений, будь они входящими или исходящими, вы можете просто сгруппировать их в отсортированный список от и до.Таким образом, и 10000 -> 2222. и 2222 -> 10000 группируются под хэш-ключом [10000, 2222], и ваши сообщения группируются так, как вы ожидали.
messages = [
{id: 1, direction: 'incoming', from: '10000', to: '2222'},
{id: 2, direction: 'outgoing', from: '2222', to: '10000'},
{id: 3, direction: 'incoming', from: '10001', to: '3333'},
{id: 4, direction: 'outgoing', from: '3333', to: '10001'}
]
messages = messages.group_by do |x|
[x[:from], x[:to]].sort
end
Это вернет:
{
["10000", "2222"]=>[
{:id=>1, :direction=>"incoming", :from=>"10000", :to=>"2222"},
{:id=>2, :direction=>"outgoing", :from=>"2222", :to=>"10000"}
],
["10001", "3333"]=>[
{:id=>3, :direction=>"incoming", :from=>"10001", :to=>"3333"},
{:id=>4, :direction=>"outgoing", :from=>"3333", :to=>"10001"}
]
}