我有以下代码:
@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表示它具有认知复杂性。
如何将此方法重构为更清洁的方法?
答案 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