Rails计算并显示平均值

时间:2013-03-18 20:40:20

标签: ruby-on-rails ruby average

我试图在特定类别中平均得分。我有一张表,其中包含导演,电影,流派,评分和分数列表。当用户点击电影时,我希望他们能够看到该类型中所有其他电影的平均分数。

我认为我必须将平均方法与条件结合使用。这就是说我无法在网上找到有关这个特定主题的任何有用文档。如果有人可以指向我的指导或文章的方向,解释如何计算有条件的平均值并在视图中显示它们,我将不胜感激!

3 个答案:

答案 0 :(得分:6)

与其他计算一起,ActiveRecord提供了一个名为average的方法。您可以通过实现以下内容来使用它:

class Movie
  def self.average_by_genre(genre)
    average(:rating).where(:genre => genre)
  end
end

或者,您也可以将其实现为Movie模型的实例方法。

class Movie
  def average_rating
    self.class.average(:rating).where(:genre => self.genre)
  end
end

这样您就可以直接从视图中调用该方法。

<article>
  <header>
    <h1><%= @movie.title %></h1>
  </header>
  <p>
    <span>Average rating for genre <%= @movie.genre %>:</span> 
    <%= @movie.average_rating  %>
  </p>
</article>

答案 1 :(得分:5)

一些原始SQL怎么样?

SELECT AVG(score) FROM movies WHERE category_id = 42

或者在rails中:

Movie.where(category_id: 42).average("score")

在此处阅读更多信息:http://guides.rubyonrails.org/active_record_querying.html#average

答案 2 :(得分:0)

如何将SQL原始查询移至database view

# movies_view
SELECT m.id, AVG(m.score) avg_score, c.category_id
FROM movies m
JOIN category c
ON m.category_id

因此,您需要从MovieView

进行查询
MovieView.find(:movie_id).avg_score