Either .each do or .all isn't working how I think it should
Posted
by
user1299656
on Stack Overflow
See other posts from Stack Overflow
or by user1299656
Published on 2012-03-31T22:50:29Z
Indexed on
2012/03/31
23:29 UTC
Read the original article
Hit count: 200
So whenever someone rates a shop, I want the Shop model to calculate its new average rating and store that in the database (instead of calculating the average every time someone looks at it). So I wrote the segment of code that follows, and it doesn't work.
The loop always iterates exactly once, no matter how many shop_ratings in the database exist that have the shop's id as their shop_id. I played around with it a bit and found that every time a new rating is submitted the function is called successfully, but it only runs the loop once and sets the average to what the first rating was.
I don't know if the "query" that sets the ratings variable is wrong or if it's the loop that's wrong.
class Shop < ActiveRecord::Base
has_many :shop_ratings
attr_accessible :name, :latitude, :longitude
validates_presence_of :name
validates_presence_of :latitude
validates_presence_of :longitude
def distance_to(lat, long)
return (self.longitude - long) + (self.latitude - lat)
end
def find_average
total = 0
count = 0
ratings = ShopRating.all(:conditions => {:shop_id => id})
ratings.each do |submission|
total = total + submission.rating
count = count + 1
end
update_attribute :average_rating, total/count
end
end
© Stack Overflow or respective owner