0

ID、名前、姓、role_id、permission_id を持つモデル User があります

ユーザー エントリは次のとおりです。

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]}

}
4

3 に答える 3

1

多分何かのような

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

于 2013-07-09T15:44:42.227 に答える
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
于 2013-07-09T16:57:39.400 に答える
0
Category.select([:name, :role_id, :permission_id]).group_by { |category| [category.role_id, category.permission_id] }

編集:気にしないでください、これはあなたが探しているフォーマットを完全には提供しません.

于 2013-07-09T16:35:05.903 に答える