0

我允许用户将数字值插入数据库,我可以通过每个循环输出它们。但是有没有办法只输出平均值?比如说,如果用户正在审查这个人(只有 1-5 个值),我只想输出平均值而不是

<% @ratings.each do |r| %>
  <%= r.rating %>
<% end %>

这将显示所有记录。我如何只显示平均值(这也应该需要该用户正确的评论总数)?

谢谢!

4

2 回答 2

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:

。有一个调用的本机 ActiveRecord 函数将使用一行代码average()计算给定列的平均值:

<%= @user.ratings.average('rating') %>

我相信这个功能在数据库级别上运行。如果是这样,使用此方法几乎肯定会在列出的任何解决方案中产生最低的开销。

于 2013-06-17T05:35:01.087 回答
1

最好使用一些缓存来获得平均评级。例如

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。

希望有帮助

于 2013-06-17T05:35:47.907 回答