0

这是我的报告控制器中的代码,它看起来很糟糕,谁能给我一些关于如何整理它的建议?

# app\controller\reports_controller.rb

 @report_lines  = []
   @sum_wp, @sum_projcted_wp, @sum_il, @sum_projcted_il, @sum_li,@sum_gross_profit ,@sum_opportunities = [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)
    @sum_wp += wp
    @sum_projcted_wp +=projected_wp
    @sum_il=invoice_line
    @sum_projcted_il +=projected_il
    @sum_li += line_item
    gross_profit = invoice_line - line_item
    @sum_gross_profit += gross_profit
    @sum_opportunities += opp
    @report_lines << [date.strftime("%m/%Y"),wp,projected_wp ,invoice_line,projected_il,line_item,gross_profit,opp]
    date = date.next_month
 end

我正在寻找使用某种方法,例如

@sum_a,@sum_b,@sum_c += [1,2,3] 
4

2 回答 2

5

我的即时想法是:将代码移动到模型中。

目标应该是“瘦控制器”,因此它们不应包含业务逻辑。

其次,我喜欢将我的报告行作为 OpenStruct() 对象呈现给我的视图,这对我来说似乎更干净。

因此,我会考虑将这种累积逻辑移动到(很可能)Report 上的一个类方法中,并返回一组“报告行”OpenStructs 和一个总计 OpenStruct 以传递给我的视图。

我的控制器代码会变成这样:

@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

完全未经测试,但是对于向 Array 添加单行方法并在模型中执行单个额外减法,这是一个地狱般的减少。

于 2009-06-03T08:40:05.443 回答
2

创建一个包含所有这些字段的求和对象,将整个数组传递给 @sum.increment_sums(Report.data_of...)

于 2009-06-03T08:39:17.663 回答