如何重构和降低复杂性

时间:2017-12-05 16:56:27

标签: ruby refactoring

我有以下代码:

@model = "ford"
@attribute = "name"

def grouped
   grouped = {}

   @array.each do |r|
     field = r.car.send(@model)

     if field.is_a? ActiveRecord::Associations::CollectionProxy
        field.each do |obj|
           key = obj.send(@attribute)
           grouped[key] = [] unless grouped.has_key?(key)
           grouped[key].push(r)
       end
     else
       key = field.send(@attribute)
       grouped[key] = [] unless grouped.has_key?(key)
       grouped[key].push(r)
     end
   end

  grouped
end

结果是:

{ford: [a, b, c]}

codeclimate表示它具有认知复杂性。

如何将此方法重构为更清洁的方法?

1 个答案:

答案 0 :(得分:1)

def grouped
   @array.each_with_object(Hash.new { |h, k| h[k] = [] }) do |r, grouped|
     case field = r.car.send(@model)
     when ActiveRecord::Associations::CollectionProxy
        field.each do |obj|
          grouped[obj.send(@attribute)] << r
        end
     else
       grouped[field.send(@attribute)] << r
     end
   end
end