查找最常出现的对象的方法

时间:2013-11-27 22:37:36

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

我有一些名为Pins的对象,用户可以将这些对象发布到网站上。这些图钉具有属于它们的艺术家属性。

是否有方法可以找到哪个艺术家姓名最多发布到网站?基本上我需要找到Pin.all的模式平均值。

展开:这是一个音乐评论网站。用户发表了对相册的评论。这些帖子被称为Pins。每个Pin都有:专辑,:艺术家等。

我要做的是列出网站的统计信息。我有@ pins.count用于总引脚,@ users.count用于总用户数。我想列出最受评论的专辑,哪个艺术家得到最多评论,等等:

<h4>The most reviewed artist on the site: </h4><%= mostReviewed %>

3 个答案:

答案 0 :(得分:3)

如果我正确理解您的问题,您可以使用each_with_object ...

@hash = Pins.scoped.each_with_object(Hash.new(0)) do |pin, hash|
          hash[pin.artist.id] += 1
        end

这会返回一个哈希,其中键是artists ID,而值是该艺术家有多少Pins的数量......

如果有大量Pins,您可以使用find_each执行此操作:       @hash = Hash.new(0)

  Pins.find_each do |pin|
    @hash[pin.artist.id] += 1
  end

如果您将上述任一项放入控制器方法中,@hash将可用于辅助方法,然后您可以使用该方法获取评价最多的艺术家。例如:

def mostReviewed
  @hash.max_by {|key, value| value }.first
end

这将为您提供具有最高值的键(或艺术家),可以在以下视图中使用:

<h4>The most reviewed artist on the site: </h4><%= mostReviewed %>

答案 1 :(得分:1)

我实际上最终将以下代码放在页面控制器中:

@popular_artist = Pin.count(:all,
                            :group => 'artist',
                            :order => 'count(*) DESC').first

以下在我看来只显示艺术家姓名:

<%= @popular_artist[0] %>

答案 2 :(得分:0)

artists = Hash.new(0)
Pin.all.each { |pin| artists[pin.artist] += 1 }