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ď č. 1Ak 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í.