我允许用户将数字值插入数据库,我可以通过每个循环输出它们。但是有没有办法只输出平均值?比如说,如果用户正在审查这个人(只有 1-5 个值),我只想输出平均值而不是
<% @ratings.each do |r| %>
<%= r.rating %>
<% end %>
这将显示所有记录。我如何只显示平均值(这也应该需要该用户正确的评论总数)?
谢谢!
我允许用户将数字值插入数据库,我可以通过每个循环输出它们。但是有没有办法只输出平均值?比如说,如果用户正在审查这个人(只有 1-5 个值),我只想输出平均值而不是
<% @ratings.each do |r| %>
<%= r.rating %>
<% end %>
这将显示所有记录。我如何只显示平均值(这也应该需要该用户正确的评论总数)?
谢谢!
有几种方法可以解决这个问题。例如,您可能会将此逻辑抽象为自定义助手。我将采取的方法是将这个逻辑带入模型并在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:
哇。有一个调用的本机 ActiveRecord 函数将使用一行代码average()
计算给定列的平均值:
<%= @user.ratings.average('rating') %>
我相信这个功能在数据库级别上运行。如果是这样,使用此方法几乎肯定会在列出的任何解决方案中产生最低的开销。
最好使用一些缓存来获得平均评级。例如
user has_many ratings
和rating belongs_to :user
然后在评级模型中,您可能有一个 after_save 回调来保存其用户的平均评级。要实现这一点,您必须在后模型中有 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。
希望有帮助