/ / iterujte a získajte súčet - rubínovo-na-koľajnice, rubín, model-view-controller

opakovať a získať sumu - rubínovo-na-koľajnice, rubín, model-view-controller

Vytváram jednoduchú faktúru. Mám model faktúry, ktorý má viacero položiek a: položky patrí k faktúre.

Pokiaľ ide o schému modelu: Faktúry majú jednoducho stĺpec pre ukladanie názvu a položky sa starajú o všetky (cenové) sumy a množstvo.

Mám index faktúr, kde je zoznamFaktúry sa zobrazujú s ich "celkovou sumou". Celková suma za každú faktúru sa určuje pomocou metódy "quantity_amount_sum", ktorú som nastavil v modeli položiek, ktorý obsahuje všetky položky faktúry a vynásobí množstvo podľa množstva a určuje celkový súčet všetkých položiek faktúry.

model: 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 %>

model invoice.rb

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

Problém je v tom, že sa snažím zhrnúť "grandcelkom "pre indexovú stránku (napr .: dve faktúry, každá so súčtom položiek, faktúra č. 1 je 100, faktúra č. 2 je 200 EUR, potom chcem" celkom "faktúr, ktoré by mali byť 300 EUR). pokúsil sa vynechať prostredníctvom každej faktúry s použitím "každého urobiť" za celkom, ale len som mohol získať sumu za poslednú faktúru, nikdy kombinované.

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

model invoice.rb

 def self.total_val
@@item_amount
end

Výsledkom by bola suma iba poslednej faktúry (alebo 200 EUR), pričom celková suma by mala byť 300 EUR.

odpovede:

0 pre odpoveď č. 1

Ak chcete celkový súčet oboch faktúr, môžete tento riadok zmeniť takto:

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

do tohto:

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

Vidím však, že sa približujete k položkám na výpočet celkovej čiastky faktúry. Odporúčam vám pridať nový stĺpec s názvom: total na invoices namiesto toho. Neskôr môžete vo svojom počítači vytvoriť spätné volanie Invoice Model:

before_save :update_total

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

Ktoré budú ľahko prístupné a opakovať v budúcnosti, keď vaše dáta rastie. Takisto sa uistite, že máte ďalšie spätné volanie Item ktoré aktualizujú súvisiace Invoice"celkom v prípade, ak sa položka upravuje.

Následne môžete zmeniť názov na:

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

Taktiež nemusíte písať return tu:

def quantity_amount_sum
self.quantity * self.amount
end

Ruby vráti posledný výraz v predvolenom nastavení.