Рельсы комбинации из двух столбцов - PullRequest
0 голосов
/ 09 октября 2018

В моем проекте Ruby on Rails у меня есть модель Message, которая имеет столбцы direction, from, to.direction может быть «входящим» или «исходящим».

Я хочу сгруппировать сообщения в разговоры по полям from и to.Скажем, у меня есть следующие сообщения в моей базе данных:

{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'}

В конце я хотел бы иметь хеш, который выглядит как {['10000','2222']=>[message with id 1, message with id 2], ['10001','3333']=>[message with id 3, message with id 4]}

Я пытался Message.all.group_by{|m| [m.from, m.to]}, но этодаст мне хеш с ключами [['10000', '2222'], ['2222','10000'],['10001', '3333'], ['3333','10001']].Здесь я повторил ключи, хотя их порядок отличается.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Попробуйте, где messages ваши сообщения.

messages.group_by do |m|
  m.direction == "incoming" ? [m.from, m.to] : [m.to, m.from]
end
0 голосов
/ 10 октября 2018

Вы можете сделать это еще с 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"}
  ]
 }
0 голосов
/ 09 октября 2018

Я думаю, что вы хотите:

direction = Hash.new

Message.all.each do |message|
  if message.direction == "incoming"
    from = message.from
    to = message.to
  else
    from = message.to
    to = message.from
  end

  direction[[from, to]] ||= []
  direction[[from, to]] << "message with id #{message.id}"
end

Теперь direction будет хешем, который вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...