2009-06-03 15 views
0

これは私のレポートコントローラのコードです。ちょうど良くないように見えますが、誰かがそれを整理する方法についていくつか提案できますか?このRuby(コントローラ)コードをどのようにリファクタリングするのですか?

# 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] 

答えて

5

私の考えは、コードをモデルに移動することです。

目的は「シンコントローラ」なので、ビジネスロジックを含むべきではありません。

第2に、OpenStruct()オブジェクトとして私のビューにレポートラインを提示したいと思います。

だから、この蓄積ロジックをReportのクラスメソッドに移動し、 "レポート行"のOpenStructs配列と単一の合計OpenStructをビューに渡すことを検討したいと思います。

@report_lines, @report_totals = Report.summarised_data_of_inv_and_dlvry_rpt(@part_or_service, @start_date, num_of_months) 

EDIT:私のコントローラのコードはこのようなものになるだろう

(後日)

は、その追加蓄積-に-アレイの事を見て、私はこの思い付きました:

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 

ルック:テスト!それはうまくいくようです。 2つの配列のサイズの違いのチェックはありません。そのため、さまざまな方法がありますが、コンセプトは十分に見えます。私はActiveRecordの結果セットを取って、OpenStructに蓄積してレポートに使う傾向があるようなものを試してみたいと思っています...

私たちの新しい配列メソッドは元のコードを何かこのような:レポート#のdata_of_invoicing_and_delivery_reportもgross_profitがにさらに減少するであろう計算することができれば

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 

...:

num_of_months.times do 
    totals.add_corresponding(Report.data_of_invoicing_and_delivery_report(@part_or_service,date)) 
end 

完全にテストされ、国連が、それはAの削減の地獄です1行のメソッドをArrayに追加し、モデルで1回の余分な減算を実行します。

+0

のヒントのためのおかげで、しかし、私はこれについて sum_a、@ sum_b、@ sum_c + = [1,2,3] @任意のアイデアのようないくつかの方法を使用していますよ? –

2

のようないくつかの方法を使用しているよ、@に全体配列を渡すsum.increment_sums(Report.data_of ...)

関連する問題