Frage

Diese

ist der Code in meinen Berichten Controller, es sieht einfach so schlecht, kann jemand mir einige Vorschläge, wie es aufzuräumen?

# 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

Ich suche eine Methode wie

zu verwenden,
@sum_a,@sum_b,@sum_c += [1,2,3] 
War es hilfreich?

Lösung

My Instant-Gedanke ist: der Code zu einem Modell bewegen

.

Das Ziel „Thin-Controller“ sein sollte, so sollten sie nicht Geschäftslogik enthalten.

Zweitens Ich mag meinen Bericht Linien auf meine Ansichten als OpenStruct () Objekte präsentieren, die mir sauberer scheint.

So halte ich würde diese Ansammlung logisch denken können in (höchstwahrscheinlich) einer Klassenmethode auf Report und eine Reihe von „Report line“ OpenStructs Rückkehr und einer einzelnen Summen OpenStruct meiner Ansicht zu übergeben.

Mein Controller-Code würde wie folgt sein:

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

EDIT: (Ein Tag später)

Mit Blick auf, dass das Hinzufügen Akkumulieren-in-ein-Array Sache, ich kam mit dieser:

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

Look: ein Test! Es scheint gut zu funktionieren. Es gibt keine Kontrollen für Unterschiede in der Größe zwischen den beiden Feldern, so gibt es viele Möglichkeiten, es schief gehen könnte, aber das Konzept scheint genug klingen. Ich betrachte etwas versuchen ähnlich, die mir eine Active resultset nehmen lassen würde und es in ein OpenStruct ansammeln, das ist das, was ich neige dazu, in meinen Berichten verwenden ...

Unsere neue Array-Methode könnte den ursprünglichen Code zu so etwas wie dies vermeiden:

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 

... die, wenn Report # data_of_invoicing_and_delivery_report auch gross_profit berechnen könnte, würde noch weiter reduzieren zu:

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

Völlig un-geprüft, aber das ist eine Hölle einer Reduktion für die Zugabe einer einzeilige Methode Array und eine einzige zusätzliche Subtraktion in einem Modell durchgeführt wird.

Andere Tipps

Erstellen Sie eine Summen Objekt, das alle Felder enthält, übergeben Sie das gesamte Array zu @ sum.increment_sums (Report.data_of ...)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top