ruby-on-rails - 使用 Ruby 按两个条件对哈希数组进行分组

标签 ruby-on-rails ruby arrays hash

我有一个像这样的哈希数组,出于演示目的,我删除了一些记录。

[
  {
    "id"=>425343308605714432, 
    "text"=>"Hello", 
    "sender"=> {
      "id"=>1375480994, 
      "name"=>"Rocket"
    }, 
    "sender_id"=>1375480994, 
    "recipient"=> {
      "id"=>24766510,
      "name"=>"Max Rose-Collins"
    }, 
    "recipient_id"=>24766510, 
    "recipient_id_str"=>"24766510", 
    "recipient_screen_name"=>"maxrosecollins", 
    "created_at"=>"Mon Jan 20 19:05:21 +0000 2014" 
  },
  {
    "id"=>413305410666639361,  
    "text"=>"How are you", 
    "sender"=> {
      "id"=>24766510,  
      "name"=>"Max Rose-Collins"
    }, 
    "sender_id"=>24766510, 
    "sender_screen_name"=>"maxrosecollins", 
    "recipient"=> {
      "id"=>1375480994, 
      "name"=>"Rocket"
    }, 
    "recipient_id"=>1375480994, 
    "recipient_id_str"=>"1375480994", 
    "recipient_screen_name"=>"Rocket", 
    "created_at"=>"Wed Dec 18 13:51:03 +0000 2013"
  }
]

这个哈希数组还包含其他用户之间的其他消息。 我想将其安排到包含两个用户之间发送和接收的消息的对话中。 我尝试过使用

.group_by { |r| [r['recipient_id'], r['sender_id']] }

但这并没有按照我的想法对它们进行分组。它使两组一组发送,一组接收。

{
  [1375480994, 24766510]=>[removed for presentation], 
  [24766510, 1375480994]=>[removed for presentation],
  [24766510, 146385359]=>[removed for presentation],
  [146385359, 24766510]=>[removed for presentation],
}

如何将这两个哈希合并为一个,以便将整个对话集中在一个地方,就像线程对话一样?

最佳答案

为了按对话对它们进行分组,您可以将 sort 方法添加到 group_by 函数中:

.group_by{ |r| r.values_at('recipient_id', 'sender_id').sort }

关于ruby-on-rails - 使用 Ruby 按两个条件对哈希数组进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21262163/

相关文章:

ruby-on-rails - 跳过对create方法的验证

ruby-on-rails - Ruby on Rails - Git 分支工作流程

javascript - 我怎样才能随机播放两个js数组而不使它们不匹配

java - 从二维数组中提取偶数列的问题

java - 选择排序不返回排序数组

ruby-on-rails - 将 PDF 拆分为 png

ruby-on-rails - Rails3 RVM 和 zsh

ruby-on-rails - factory_girl transient 属性的未定义方法

ruby-on-rails - 在 heroku 安装 therubyracer,未能构建 gem native 扩展

ruby-on-rails - Rails Controller 测试 : How to disable before_filter of controller while testing?