I find my self often doing things like this in Ruby on Rails:
@count = 0
LineItem.all.each do |item|
if (item.cart_id == @cart.id)
@count += item.quantity
end
end
So many things look wrong with this, but I want to initialize my variable (@count) before the loop, and then be able to use it after I'm out of the loop.
Is there a better way to do this?
2 Answers 2
From what I can see, you are just collecting the item.quantity
of all matching
items. This can be accomplished by
@count = LineItem.all.find_all{|i| i.cart_id == @cart.id}.map{|i| i.quantity}.inject(0,:+)
Do you mean that you might be doing something else with in the cart_id check?
-
\$\begingroup\$ Both this and the other answer work. This one seems to complete the queries faster. I'm using Postgres. Thank you both! \$\endgroup\$David West– David West2012年06月28日 17:41:17 +00:00Commented Jun 28, 2012 at 17:41
If you work with database you can do this more efficiently with sql request:
LineItem.where(:card_id => @card.id).sum('quantity')
This is equivalent sql query
SELECT SUM(items.identity) FROM items WHERE items.card_id = ?;