gpt4 book ai didi

ruby-on-rails - .each do 或 .all 没有按我认为的方式工作

转载 作者:太空宇宙 更新时间:2023-11-03 16:07:48 24 4
gpt4 key购买 nike

因此,每当有人对商店进行评分时,我希望 Shop 模型计算其新的平均评分并将其存储在数据库中(而不是每次有人查看时都计算平均值)。所以我写了下面的代码段,但它不起作用。

循环总是只迭代一次,无论数据库中有多少 shop_ratings 以商店的 id 作为他们的 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

最佳答案

这是一个更好的 find_average 方法(顺便说一句,它应该被称为 set_average_rating 因为你没有找到它,你正在保存它)

shop.rb - 替换为:find_average

def set_average_rating
update_attribute(:average_rating, shop_ratings.average(:rating))
end

如您所见,我们正在利用 AR 的平均计算方法,该方法返回一个 float 。文件:http://ar.rubyonrails.org/classes/ActiveRecord/Calculations/ClassMethods.html#M000293

说到 float ,您现有的代码似乎无法正确计算平均值的原因可能是 b/c 您没有告诉 ruby​​ 最终平均值是 float ,而不是整数.希望您已将 shop#average_rating 字段定义为 float 或小数,而不是整数。

关于ruby-on-rails - .each do 或 .all 没有按我认为的方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9960393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com