Моя мгновенная мысль: переместить код в модель.
Целью должны быть «Тонкие контроллеры», поэтому они не должны содержать бизнес-логику.
Во-вторых, мне нравится представлять свои строки отчета в моих представлениях как объекты OpenStruct (), что мне кажется более понятным.
Поэтому я бы подумал о переносе этой логики накопления в (скорее всего) метод класса в Report и возвращение массива OpenStructs «строки отчета» и отдельных итогов OpenStruct для передачи в мой View.
Код моего контроллера стал бы примерно таким:
@report_lines, @report_totals = Report.summarised_data_of_inv_and_dlvry_rpt(@part_or_service, @start_date, num_of_months)
РЕДАКТИРОВАТЬ: (день спустя)
Глядя на это добавление накопления в массив, я придумал следующее:
require 'test/unit'
class Array
def add_corresponding(other)
each_index { |i| self[i] += other[i] }
end
end
class TestProblem < Test::Unit::TestCase
def test_add_corresponding
a = [1,2,3,4,5]
assert_equal [3,5,8,11,16], a.add_corresponding([2,3,5,7,11])
assert_equal [2,3,6,8,10], a.add_corresponding([-1,-2,-2,-3,-6])
end
end
Смотри: тест! Вроде работает нормально. Нет никаких проверок различий в размерах между двумя массивами, поэтому есть много способов, которые могут пойти не так, но концепция кажется достаточно здравой. Я подумываю попробовать что-то подобное, что позволило бы мне взять набор результатов ActiveRecord и накапливать его в OpenStruct, что я обычно использую в своих отчетах ...
Наш новый метод Array может уменьшить исходный код примерно до следующего вида:
totals = [0,0,0,0,0,0,0]
date = @start_date
num_of_months.times do
wp, projected_wp, invoice_line, projected_il, line_item, opp = Report.data_of_invoicing_and_delivery_report(@part_or_service,date)
totals.add_corresponding [wp, projected_wp, invoice_line, projected_il, line_item, opp, invoice_line - line_item]
@report_lines << [date.strftime("%m/%Y"),wp,projected_wp ,invoice_line,projected_il,line_item,gross_profit,opp]
date = date.next_month
end
@sum_wp, @sum_projcted_wp, @sum_il, @sum_projcted_il, @sum_li, @sum_opportunities, @sum_gross_profit = totals
... который, если Report # data_of_invoicing_and_delivery_report может также вычислить gross_profit
, уменьшится еще больше до:
num_of_months.times do
totals.add_corresponding(Report.data_of_invoicing_and_delivery_report(@part_or_service,date))
end
Полностью непроверенный, но это чертовски много для добавления однострочного метода в массив и выполнения единственного дополнительного вычитания в модели.
person
Mike Woodhouse
schedule
03.06.2009