2011-10-16 5 views
4

Contexte: J'ai 2 modèles Ordre et article.rails manière de calculer le sous-total et total

Je veux calculer le sous-total de l'article basé sur item.quantity * item.price Pour l'instant ceci est fait dans la vue (mais pas l'endroit approprié). J'ai également besoin de calculer le total de la commande, mais je suis coincé. Je n'ai pas de colonne pour ça. Quelle est la meilleure approche? Utilisez le modèle? Aide ou observateur?

Pour l'instant je réussi à avoir sous-total de travail par ordre aide

def item_subtotal(item) 
    item_subtotal = item.quantity * item.price 
end 

Solution de travail:

modèle de l'article

def subtotal 
    price * quantity 
end 

Dans la vue render <%= item.subtotal %>

ordre mo del

def total_price 
    total_price = items.inject(0) { |sum, p| sum + p.subtotal } 
end 

Commande # Afficher la vue de rendre <%= number_to_currency(@order.total_price) %>

Répondre

0

Comme il est une fonctionnalité du modèle (vous voulez calculer quelque chose de l'élément qui est auto-référentiel), l'emplacement plus approprié est le modèle lui-même , de sorte que vous pouvez facilement utiliser

item.subtotal 
+0

quel modèle: commandez ou article? Comment sait-il que le sous-total est égal au prix * quantité? Qu'en est-il du total? – Gaelle

+1

Le sous-total doit être défini dans le modèle 'Item' tandis que le total général doit être calculé dans le total' Order' en sélectionnant tous les éléments et en calculant leur sous-total. – Jack

+0

Pouvez-vous s'il vous plaît écrire un exemple pour le total et surtout comment rendre dans la vue. Merci. La vue d'ordre # show va comme ceci '<% pour l'item dans @ order.items%><% = item.price%>' – Gaelle

7

Sur votre modèle de l'article, vous pouvez ajouter une méthode sous-total:

def subtotal 
    quantity * price 
end 

En supposant que vous êtes modèle Ordre comme une relation has_many avec article, vous pouvez map la collection pour obtenir une liste des prix sur le modèle de commande:

def subtotals 
    items.map do |i| i.subtotal end 
end 

Parce que vous êtes en cours d'exécution dans un Rails environnement, vous pouvez utiliser la méthode activesupport sum pour obtenir le total sur un modèle de commande:

def total 
    subtotals.sum 
end 

Ou si vous préférez mettre tous ensemble:

def total 
    items.map do |i| i.subtotal end.sum 
end 

Ensuite, vous pouvez utiliser le sous-total sur l'article et le total sur commande dans vos vues.

Edit: La vue pourrait ressembler à ceci:

<% for item in @order.items %> <%= item.price %><br/><% end %> 
<%= @order.total %> 
0

Vous pouvez afficher la item_subtotal en utilisant

et pour le total, vous pouvez le calculer par

TOTAL_PRICE = @Order .items.to_a.sum {| item | total = item.product.price * article.quantité}

Je pense que cela fonctionnera pour vous.

Questions connexes