当前位置: 首页 > 面试题库 >

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

慕容坚
2023-03-14
问题内容

给定模型所在的相同场景

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")

问题答案:

您正在寻找的内容与标准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}


 类似资料:
  • 问题内容: 如果我有这样的表和数据: 我希望按照从小到大的Group总数对它进行排序,例如:A-2个记录,B-1个记录,C-3个记录,因此它将变为: 我试过了 但这只会为我返回一个结果。 有什么提示吗?谢谢。 问题答案: 您需要首先聚合数据,这可以使用GROUP BY子句完成: 关键字DESC允许您首先显示最高计数,默认情况下按ORDER BY升序排列,这将首先显示最低计数。

  • 问题内容: 我有一个模型可以使用“使行为成为现实”宝石(Github页面)进行投票。投票系统工作正常,但我尝试显示按每个页面有多少排序的页面。 目前,我的控制器根据标签提取资源,但未排序: 如果我使用单个资源并调用“ @ resource.votes.size”,它将返回其拥有的票数。但是,票数是另一张桌子,因此我认为需要进行某种形式的合并,但我不确定如何进行。我需要的是一个可以这样显示的漂亮的有

  • 问题内容: 我有一个名为的模型。我也有一个名为的模型。A 和一首歌(可以收听很多次)。 在我的模型中,我想定义一个方法,该方法应返回收听次数最多的前5首歌曲。如何使用关系实现这一目标? 我正在使用Rails 3.1。 谢谢! 问题答案: 使用命名范围:

  • 问题内容: 我有一些这样的数据: 我想查询它看起来像这样: …这样我就可以按数字连续的方式按GROUP BY分组。 另外,循环/游标也是不可能的,因为我正在处理大量数据,谢谢。 问题答案:

  • 问题内容: 如何使用Sequelize查找关系中的某个列满足条件的所有人? 一个示例是查找所有作者姓氏为“ Hitchcock”的图书。书籍架构包含与Author’s表的hasOne关系。 编辑:我了解如何使用原始SQL查询来完成,但是正在寻找另一种方法 问题答案: 这是一个有效的示例,说明如何让Sequelize 通过具有特定姓氏的来获取全部信息。它看起来比实际要复杂得多,因为我正在定义模型,将

  • 问题内容: 我有下表称为问题: 我只想选择每个询问者一次,如果有多个同名提问者,请选择ID最高的一个。因此,预期结果: 我使用以下查询: 我得到以下结果: 因此,它将选择遇到的第一个“鲍勃”,而不是最后一个。 谢谢 问题答案: 如果要为每一个添加最后一个,则应使用聚合函数: 之所以得到不寻常的结果,是因为MySQL使用了一个扩展名,该扩展名允许未选择列表中的项进行汇总,并且不包含在GROUP BY