如何重构这个红宝石(控制器)代码?
-
09-09-2019 - |
题
这是我的报告中控制器的代码,它只是看起来那么糟糕,任何人都可以给我如何整理一下?
一些建议# 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]
解决方案
我的瞬间思想是:代码移动到一个模型
。的目标应该是“薄控制器”,因此它们不应该包含业务逻辑。
其次,我想呈现我的报告线我的意见作为OpenStruct()对象,这似乎清洁我。
所以我认为这种积累逻辑移入(最有可能的)上报告一个类的方法和返回的“报告线” 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,这就是我倾向于在我的报告中使用...
我们的新的磁盘阵列方法可能原代码减少是这样的:
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
...这要是报告#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
完全未测试,但是这是用于添加一个单行方法阵列的减小的地狱和在模型中进行一个额外的减法。
其他提示
创建包含所有这些字段的总和对象,整个数组传递给@ sum.increment_sums(Report.data_of ...)
不隶属于 StackOverflow