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

时间:2015-07-02 18:47:25

标签: ruby-on-rails ruby activerecord

我有一个模型调查和模型音乐。调查has_and_belongs_to_many音乐和音乐has_and_belongs_to_many调查。

音乐有一个id和一个名字字段。参加调查的用户必须在不同的音乐之间进行选择。

我想为一组调查获得最多的音乐。

我结束了这样的事情:

surveys.joins(:musics).group("musics.id").order("count(musics.id) desc")

(调查是给定日期的一组调查) 但这给了我一个模糊的“created_at”的错误,所以为了测试我使用了所有的Survey表而不是一组:

Survey.joins(:musics).group("musics.id").order("count(musics.id) desc")

但现在的错误是“surveys.id”必须出现在GROUP BY子句中或用于聚合函数。

我做错了什么,如何才能得到我想要的结果?

3 个答案:

答案 0 :(得分:1)

我最终做了一个关于音乐的范围作为休闲(调查是在给定时间范围内的一组调查):

scope :avrg, ->(surveys) { joins(:surveys).where("surveys_musics.survey_id in (?)", surveys).group("musics.id")
    .order("count(surveys.id) desc").limit(1).first.name }

答案 1 :(得分:0)

看起来您收到了模糊的created_at错误,因为您用于创建调查的查询未指定表。尝试将其更改为:

surveys = Survey.where("surveys.created_at > '#{your_datetime_variable}' ")

然后进行加入

答案 2 :(得分:0)

您应该尝试将此结果作为音乐及其相应的计数来实现,之后您可以使用rails hash方法获取最常用的音乐,只需验证您的列名和关系表名称:

result=Music.joins(:surveys).group("DATE(survey_musics.created_at),survey_musics.music_id").select("musics.name as name, count(*) as number_of_time_used")

通过ruby哈希方法查找最大使用的音乐名称

result.inject({}) { |hsh, r| hsh[r.name] = r.number_of_time_used; hsh }.max_by{|k,v| v}

否则你通过组合使用它:

Music.joins(:surveys).group("DATE(survey_musics.created_at),survey_musics.music_id").select("musics.name as name, count(*) as number_of_time_used").inject({}) { |hsh, r| hsh[r.name] = r.number_of_time_used; hsh }.max_by{|k,v| v}

我认为这可能对你有帮助。