使用“查找”方法查找项目的最高出现次数

时间:2015-09-15 16:03:11

标签: ruby-on-rails ruby sorting find filtering

我有一个模型设置,其中艺术家通过相册有很多类型。我正试图从属于艺术家的所有专辑中获得最多的类型。

我已成功使用group()sort()limit()方法完成此操作,但由于我只需要一种类型,我认为更简洁的方法是使用find()。转换我现有的最好的方法是什么?

class Artists < ActiveRecord::Base
  has_many :albums
  has_many :genres, through: :albums

  def common genre
    genres.group("genres.id").order("count(genres.id) DESC").limit(1)
  end
end

2 个答案:

答案 0 :(得分:0)

find不适用于你拥有的东西。

使用.first代替.limit(1),即使用genres.group("genres.id").order("count(genres.id) DESC").first ,唯一稍微更惯用的方法就是使用,

{{1}}

[OP评论后编辑]

答案 1 :(得分:0)

您可以为每位艺术家缓存顶级类型:

  • 艺术家表中的新专栏 - top_genre
  • after_create(和after_save)专辑回调,更新当前专辑艺术家的top_genre

然后你只需使用top_genre属性而不是group_by和count查询。