ruby on rails:数据库中的平均数值

时间:2013-06-17 05:27:23

标签: ruby-on-rails ruby-on-rails-3

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

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

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

谢谢!

2 个答案:

答案 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。

希望有所帮助