Общая часть выглядит следующим образом:
@dive_centers.each_with_object(Hash.new(0)) { |obj, counts| counts[...] += 1 }
с ...
, равным
obj.training_organizations.first.short_name
и
obj.dive_center_type
Оба вышеперечисленных зависят от obj
, поэтому мы можем извлечь общую часть в отдельный метод и использовать yield
для извлечения ключа из вызывающей стороны:
def count_by
@dive_centers.each_with_object(Hash.new(0)) { |o, h| h[yield(o)] += 1 }
end
т.е. мы предоставляем конкретную часть, передавая блок:
def build_training_organization_filters
count_by { |center| center.training_organizations.first.short_name }
end
def build_dive_center_type_filters
count_by { |center| center.dive_center_type }
end