2013-07-09 61 views
0

如何重组结果我有拥有ID,姓名,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([:姓名,: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]} 

} 
+0

你需要在选择,即所有非凝固字段组合。 role_id,permission_id,名称 – Boynux

回答

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 
1

可能像

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

+0

我认为|角色|这里提供的只是role_id。我不认为这会有group_by方法。 –

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

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