Поэтому, когда кто-то оценивает магазин, я хочу, чтобы модель магазина рассчитывала его новый средний рейтинг и сохранял его в базе данных (вместо того, чтобы вычислять средний каждый раз, когда кто-то смотрит на него). Поэтому я написал следующий фрагмент кода, и он не работает.
Цикл всегда повторяется ровно один раз, независимо от того, сколько существует shop_ratings в базе данных с идентификатором магазина в качестве shop_id. Я немного поэкспериментировал с этим и обнаружил, что каждый раз, когда передается новый рейтинг, функция вызывается успешно, но она запускает цикл только один раз и устанавливает среднее значение для первого рейтинга.
Я не знаю, является ли "запрос", который устанавливает переменную оценок, неправильным или неправильным является цикл.
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