我允许用户在数据库中插入数字值,我可以通过每个循环输出它们。但有没有办法输出平均值?比如说,如果用户正在审核此人(只有1-5个值),我只想输出平均值而不是
<% @ratings.each do |r| %>
<%= r.rating %>
<% end %>
显示所有记录。我如何仅显示平均值(这也应该需要该用户拥有的评论总数)?
谢谢!
答案 0 :(得分:1)
有几种方法可以解决这个问题。例如,您可以将此逻辑抽象为自定义帮助程序。我将采用的方法是将此逻辑引入模型并在User
模型本身上创建一个便捷方法:
# app/models/user.rb
class User < ActiveRecord::Base
has_many :ratings
def average_rating
ratings_array = ratings.map(&:rating)
ratings_array.inject{ |sum, el| sum + el }.to_f
end
end
然后,如果你的观点,你会像这样访问评级:
<%= @user.ratings %>
更新:
如果你倾向于使用视图助手,那么这样的事情就可以了:
# app/helpers/ratings_helper.rb
module RatingsHelper
def average_rating(ratings)
ratings_array = ratings.map(&:rating)
ratings_array.inject{|sum, el| sum + el}.to_f
end
end
在您看来,您可以通过传入评分来计算平均值来访问平均值:
<%= average_rating(@user.ratings) %>
更新2:
<强>哇即可。有一个名为average()
的本机ActiveRecord函数,它将使用一行代码计算给定列的平均值:
<%= @user.ratings.average('rating') %>
我相信这个功能在数据库级别上运行。如果是这样,使用这种方法几乎肯定会产生所列出的任何解决方案的最低开销。
答案 1 :(得分:1)
最好使用一些缓存来获得平均评分。例如
user has_many ratings
和rating belongs_to :user
然后在评级模型中,您可以使用after_save call_back将平均评分保存到其用户。要实现这一点,您必须在post模型中使用average_ratings列。
并在rating.rb中:
after_save :update_average_ratings
private
def update_average_ratings
average_ratings = self.user.ratings.collect(&:rating).sum / self.user.ratings.count
user.update_attributes(average_ratings: average_ratings)
end
效率非常高,您可以在需要时调用@ user.average_ratings。
希望有所帮助