我有一个模型调查和模型音乐。调查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子句中或用于聚合函数。
我做错了什么,如何才能得到我想要的结果?
答案 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}
我认为这可能对你有帮助。