/ / iteriere durch und erhalte die Summe - Ruby-on-Rails, Ruby, Model-View-Controller

durchlaufen und erhalten Summe - Ruby-on-Rails, Ruby, Model-View-Controller

Ich baue eine einfache Rechnungs App. Ich habe ein Rechnungsmodell, das viele Artikel hat: Artikel gehört zu: Rechnung.

So weit das Modellschema geht: Rechnungen haben einfach eine Spalte zum Speichern eines Titels, und: items kümmert sich um alle (Preis-) Mengen- und Mengenangaben.

Ich habe einen Rechnungsindex, wo eine Liste vonRechnungen werden mit ihrem "Gesamtbetrag" angezeigt. Der Gesamtbetrag für jede Rechnung wird durch eine Methode "quantity_amount_sum" bestimmt, die ich im Artikelmodell eingerichtet habe, die alle Positionen der Rechnung übernimmt und die Menge mit dem Betrag multipliziert, um die Summe aller Positionen auf der Rechnung zu bestimmen.

Modell: item.rb

def quantity_amount_sum
return self.quantity * self.amount
end

index.html.erb

<% @invoices.each do |invoice| %>
$<%= invoice.item_amount.sum.floor %>
<% end %>

Modell invoice.rb

  def item_amount
@@item_amount = self.items.map(&:quantity_amount_sum)
end

Das Problem besteht darin, zu versuchen, einen "Großen" zusammenzufassenSumme "für die Indexseite (z. B. zwei Rechnungen mit jeweils einer Summe von Artikeln. Rechnung Nr. 1 beläuft sich auf 100, Rechnung Nr. 2 auf 200. Ich möchte dann eine" Summe "von Rechnungen, die 300 sein sollte. Ich habe Ich habe versucht, jede Rechnung mit Hilfe von "does do" für die Summe zu durchlaufen, aber ich konnte nur die Summe für die letzte Rechnung abrufen, nie die beiden zusammen.

$<%= @invoices.total_val.each.sum %>

Modell invoice.rb

 def self.total_val
@@item_amount
end

Dies würde die Summe nur der letzten Rechnung (oder $ 200) ergeben, während die Gesamtsumme $ 300 sein sollte.

Antworten:

0 für die Antwort № 1

Wenn Sie die Gesamtsumme der beiden Rechnungen erhalten möchten, können Sie diese Zeile ändern:

<% @invoices.each do |invoice| %>
$<%= invoice.item_amount.sum.floor %>
<% end %>

zu diesem:

$<%= @invoices.map(&:item_amount).flatten.sum %>

Ich sehe jedoch, dass Sie sich Gegenständen nähern, um den Gesamtbetrag der Rechnung zu berechnen. Ich würde Sie ermutigen, eine neue Spalte hinzuzufügen, die heißt: total zu invoices Tabelle stattdessen. Später können Sie einen Rückruf in Ihrem erstellen Invoice Modell:

before_save :update_total

def update_total
self.total = self.items.map{|i| i.quantity_amount_sum }.sum
end

Das wird in Zukunft leicht zugänglich und iterierbar sein, wenn Ihre Daten wachsen. Stellen Sie außerdem sicher, dass Sie einen weiteren Rückruf haben Item Klasse, die das verwandte aktualisieren Invoice"s total, falls ein Artikel bearbeitet wird.

Dann kann Ihre Ansicht geändert werden zu:

$<%= @invoices.map(&:total).sum %>

Außerdem musst du nicht schreiben return Hier:

def quantity_amount_sum
self.quantity * self.amount
end

Ruby gibt standardmäßig den letzten Ausdruck zurück.