Rails 3 ActiveRecord:按关联计数的顺序和分组

时间:2013-11-05 20:17:22

标签: sql ruby-on-rails-3 activerecord count associations

我的问题与Rails 3 ActiveRecord: Order by count on association

非常相似

给出模型

的相同情况

Song has many :listens

我想根据听众的数量对歌曲进行分组。我的目标是看到歌曲与听力的分布。有点像...

song_listen_distribution = {0 => 24, 1 => 43, 2=>11, ... MAX_LISTENS => 1}

这样song_listen_distribution[4]就会返回4次收听的歌曲数量。

上面链接问题的接受答案让我非常接近,但我无法通过“songs.listens_count”进行分组

    Song.select("songs.id, OTHER_ATTRS_YOU_NEED, count(listens.id) AS listens_count").
    joins(:listens).
    group("songs.listens_count").
    order("listens_count DESC")

1 个答案:

答案 0 :(得分:7)

您正在寻找的内容不能很好地映射到标准的ActiveRecord查询。

您可以直接调用SQL来获得最有效的搜索结果:

subquery = Song.joins(:listens).group(:id).select("songs.id, COUNT(*) as listen_count).to_sql
raw = Song.connection.select_rows("SELECT listen_count, COUNT(*) FROM (#{subquery}) t GROUP BY listen_count ORDER BY listen_count DESC")
song_listen_distribution = Hash[raw]

或者,您可以使用ActiveRecord查找所有歌曲的计数,然后在ruby中构建分发词典:

song_listens = Song.joins(:listens).group(:id).count
song_listen_distribution = song_listens.group_by{|n| n.last}.
    each_with_object({}){|(k, g), h| h[k] = g.size}