2017-12-05 16 views
0

軽減する方法:リファクタリングと私は、次のコードを持つ複雑

@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は、それが認知の複雑さを持っていることを言います。

このメソッドをどのようにリファクタリングしてクリーナーにすることができますか?

+4

作業コードは、https://codereview.stackexchange.com/に適しています。 –

+1

「@配列」とは何か、それはどこから来たのですか?私はスコープの使用を検討し、可能であればActiveRecordでいくつかのリフティングを行います。 –

+0

codereview.stackexchange.com – mmichael

答えて

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 
+0

あなたのコードは多くの助けになったので、私はこの質問を議論の対象外としています。私は気候をコードし、それが合格するかどうかを確認するために提出する –

関連する問題