如何重组数据库的结果

时间:2013-07-09 15:34:24

标签: ruby-on-rails ruby

我有一个模型用户,其中包含id,name,surname,role_id,permission_id

以下是几个用户条目:

User => {:name => 'Bob', :surname => 'surnmae', :role_id => 1, :permission_id = 2}
User => {:name => 'Alice', :surname => 'strange', :role_id => 1, :permission_id = 3}
User => {:name => 'Ted', :surname => 'Teddy', :role_id => 2, :permission_id = 3}

现在我需要先按role_id然后按permission_id对它们进行分组,这就是我的意思:

Category.select([:name,:role_id,:permission_id])。group_by(&:role_id)

制作:

{1 => 
[#<User name: "Bob", role_id: 1, permission_id: 2>,
#<User name: "Alice", role_id: 1, permission_id: 3>]
2 => [#<User name: "Ted", role_id: 2, permission_id: 3>]
}

哪个足够接近,但我需要将它们与permission_id分组,所以它看起来像这样:

{:role_id => {:permision_id => [Array of users grouped by this criteria]}

}

3 个答案:

答案 0 :(得分:1)

可能像

  

Category.select([:name,:role_id,:permission_id])。group_by(&amp;:role_id).map {| role | role.group_by(安培;:permission_id)}

答案 1 :(得分:1)

比看起来有点棘手。最好将其分为多个步骤。但是,以下单行将起作用:

Hash[ User.all.group_by(&:role_id).collect{|role, grp| [role, grp.group_by(&:permission_id)]} ]

输出将是以下(这可能是您正在寻找的):

{1=>
  {2=>[{:name=>"Bob", :surname=>"surnmae", :role_id=>1, :permission_id=>2}],
   3=>[{:name=>"Alice", :surname=>"strange", :role_id=>1, :permission_id=>3}]},
 2=>{3=>[{:name=>"Ted", :surname=>"Teddy", :role_id=>2, :permission_id=>3}]}}

相同的逻辑,但更容易理解:

output={}
User.all.group_by(&:role_id).each{|role, grp| output[role]= grp.group_by(&:permission_id)}
# output has required goruping

答案 2 :(得分:0)

Category.select([:name, :role_id, :permission_id]).group_by { |category| [category.role_id, category.permission_id] }

编辑:没关系,这并不能提供您正在寻找的格式。