2015-07-06 2 views
-1

Ищу группировать список проектов вложенной области, в этом случае custom_field.value когда определенный идентификатор передается в.Группа orderring

[{ 
    id: 1, 
    name: "project one ", 
    custom_fields: [ 
     { 
      id: 4, 
      name: "Year", 
      value: "2010" 
     }, 
     { 
      id: 5, 
      name: "Priority", 
      value: "low" 
     }, 
]}, 
{ 
    id: 2, 
    name: "project two ", 
    custom_fields: [ 
     { 
      id: 4, 
      name: "Year", 
      value: "2011" 
     }, 
     { 
      id: 5, 
      name: "Priority", 
      value: "medium" 
     }, 
]}, 
{ 
    id: 3, 
    name: "project three ", 
    custom_fields: [ 
     { 
      id: 4, 
      name: "Year", 
      value: "2012" 
     }, 
     { 
      id: 5, 
      name: "Priority", 
      value: "high" 
     }, 
]}] 

Так что, если params[:id] == 4 Я хочу список, чтобы заказать по соответствующее значение идентификатора custom_field в порядке убывания.

Так что в этом случае они будут приказаны.

2012 
2011 
2010 

Любые идеи?

+0

Что вы пробовали? Я предлагаю использовать 'Hash # map (from Enumerable)', за которым следует '# sort', а затем' # reverse'. Удачи. – floum

ответ

1

Это вы, тем что ищете? Ваш вопрос немного неясно, но я думаю, что это должно быть достаточно:

Ваш Оригинал Hash:

test = [{ 
     id: 1, 
     name: "project one ", 
     custom_fields: [ 
      { 
       id: 4, 
       name: "Year", 
       value: "2010" 
      }, 
      { 
       id: 5, 
       name: "Priority", 
       value: "low" 
      }, 
    ]}, 
    { 
     id: 2, 
     name: "project two ", 
     custom_fields: [ 
      { 
       id: 4, 
       name: "Year", 
       value: "2011" 
      }, 
      { 
       id: 5, 
       name: "Priority", 
       value: "medium" 
      }, 
    ]}, 
    { 
     id: 3, 
     name: "project three ", 
     custom_fields: [ 
      { 
       id: 4, 
       name: "Year", 
       value: "2012" 
      }, 
      { 
       id: 5, 
       name: "Priority", 
       value: "high" 
      }, 
    ]}] 

Использование group_by и sort (с обработкой для элементов, где нет найден идентификатор):

def group_and_sort(test_hash,id) 
     test_hash.group_by do |g| 
     elem = g[:custom_fields].detect {|h| h[:id] == id} 
     elem ? elem[:value] : "0" 
     end.sort.reverse.to_h 
    end 

Тогда зови, как:

group_and_sort(test,4) 
    #=>{"2012"=> 
     [{:id=>3, 
     :name=>"project three ", 
     :custom_fields=> 
     [{:id=>4, :name=>"Year", :value=>"2012"}, 
      {:id=>5, :name=>"Priority", :value=>"high"}]}], 
    "2011"=> 
     [{:id=>2, 
     :name=>"project two ", 
     :custom_fields=> 
     [{:id=>4, :name=>"Year", :value=>"2011"}, 
      {:id=>5, :name=>"Priority", :value=>"medium"}]}], 
    "2010"=> 
     [{:id=>1, 
     :name=>"project one ", 
     :custom_fields=> 
     [{:id=>4, :name=>"Year", :value=>"2010"}, 
      {:id=>5, :name=>"Priority", :value=>"low"}]}]} 
1

Предположим, projects - это данные, которые вы вставили.

def order_values_by_id(pjs, id) 
    pjs.map{|p| p[:custom_fields].find{|f| f[:id] == id}[:value] }.sort.reverse 
end 

order_values_by_id(projects) 
#=> ["2012", "2011", "2010"] 
+0

Как примечание, это не сработает, если в массиве custom_fields нет соответствующего ': id', потому что' find' вернет 'nil'. – engineersmnky

Смежные вопросы