2015-05-07 38 views
1

如何從共享相同「school_id」和「plan_type」的權限哈希合併兩個參數,然後刪除從哈希合併的權限,只留下一個。兩個以上的匹配Rails將多個參數合併爲

[{"school_id"=>"1", 
    "plan_type"=>"All", 
    "view"=>"true", 
    "create"=>"true", 
    "approve"=>"true", 
    "grant"=>"true", 
    "region_id"=>nil}, 
{"school_id"=>"1", "plan_type"=>"All", "edit"=>"true", "region_id"=>nil}, 
{"school_id"=>"2", 
    "plan_type"=>"All", 
    "edit"=>"true", 
    "grant"=>"true", 
    "region_id"=>nil}] 

def create_permissions(user, params) 
    permissions = params[:permissions].values.map { |perm| 
    if perm[:plan_type] == "" || perm[:plan_type] == "All Plans" 
     perm[:plan_type] = "All" 
    end 
    @perm_type = get_permission_type(perm) 
    case 
    when 'school' then perm.merge(region_id: nil) 
    when 'region' then perm.merge(school_id: nil) 
    end 
    }.tap { |permissions| 
    new_permissions = [] 
    permissions.each do |perm| 
     set_permissions = permissions.find {|x| (x != perm && x[:school_id] == perm[:school_id] && x[:plan_type] == perm[:plan_type]) } 
    end 
    params[:user][:region_ids] = permissions.map { |perm| perm[:region_id] }.compact 
    params[:user][:school_ids] = permissions.map { |perm| perm[:school_id] }.compact 
    } 
end 

輸出:通過

[{"school_id"=>"1", 
    "plan_type"=>"All", 
    "view"=>"true", 
    "create"=>"true", 
    "approve"=>"true", 
    "grant"=>"true", 
    "region_id"=>nil}, 
    "edit"=>"true" 
{"school_id"=>"2", 
    "plan_type"=>"All", 
    "edit"=>"true", 
    "grant"=>"true", 
    "region_id"=>nil}] 
+0

請給出一個小例子,你想要什麼輸出? – pangpang

+0

用輸出更新。 – Jay

回答

1

school_id然後減少通過合併散列:

input.group_by { |e| e['school_id'] } 
    .values 
    .map { |v| p v.reduce(&:merge) } 

要組由許多領域,人們可以使用所需的字段的數組,一個連接字符串,不管:

input.group_by { |e| [e['school_id'], e['plan_type']] } 
    .values 
    .map { |v| p v.reduce(&:merge) } 

,或者保持俏皮的標題:

input.group_by { |e| "School: #{e['school_id']}, Plan: #{e['plan_type']}" } 
    .map { |k,v| [k, v.reduce(&:merge)] } 
    .to_h 

#⇒ { 
# "School: 1, Plan: All" => { 
#  "approve" => "true", 
#  "create" => "true", 
#   "edit" => "true", 
#  "grant" => "true", 
# "plan_type" => "All", 
# "region_id" => nil, 
# "school_id" => "1", 
#   "view" => "true" 
# }, 
# "School: 2, Plan: All" => { 
#   "edit" => "true", 
#  "grant" => "true", 
# "plan_type" => "All", 
# "region_id" => nil, 
# "school_id" => "2" 
# } 
#} 
+0

我喜歡這個,我怎樣才能正確地將它按照e ['plan_type']分組?如果school_id和plan_type相同,我只想合併參數。因此,如果一個參數的plan_type爲[「1」],另一個參數的plan_type爲[「All」],則它們將不會合並。 – Jay

+0

請參閱更新。 – mudasobwa

+0

謝謝你的工作。我還有一個問題,如果我想通過region_id和school_id來做到這一點,該怎麼辦?所以如果兩個權限有region_ids,兩個有school_ids,是否有可能得到相同的結果? – Jay

0
arr1 = arr.group_by { |e| [e["school_id"],e["plan_type"]] }.values 
=> {["1", "All"]=>[{"school_id"=>"1", "plan_type"=>"All", "view"=>"true", "create"=>"true", "approve"=>"true", "grant"=>"true", "region_id"=>nil}, {"school_id"=>"1", "plan_type"=>"All", "edit"=>"true", "region_id"=>nil}], ["2", "All"]=>[{"school_id"=>"2", "plan_type"=>"All", "edit"=>"true", "grant"=>"true", "region_id"=>nil}]} 

arr1.map{ |i| i.inject({}) { |sum, e| sum.merge e}} 
=> [{"school_id"=>"1", "plan_type"=>"All", "view"=>"true", "create"=>"true", "approve"=>"true", "grant"=>"true", "region_id"=>nil, "edit"=>"true"}, {"school_id"=>"2", "plan_type"=>"All", "edit"=>"true", "grant"=>"true", "region_id"=>nil}]