<!–
MySQL Rails 3 ActiveRecord: Order by count on association错误
在Rails 3中,使用ActiveRecord操作MySQL数据库是非常常见的操作。在实际开发中,我们可能需要获取关联表中某个字段的值出现的次数,并按照出现的次数排序。这时,就需要使用MySQL的group by和order by子句。
假设我们有两个模型:User和Article,User has_many :articles,Article belongs_to :user。我们需要获取文章中出现最多的用户。我们可以使用如下代码:
users = User.joins(:articles).group(:user_id).order("count(*) DESC")
在上面的代码中,我们使用joins(:articles)将User和Article两张表关联起来,使用group(:user_id)将查询结果按照user_id分组,使用order(“count(*) DESC”)将结果按照出现次数从大到小排序。
(adsbygoogle = window.adsbygoogle || []).push({});
我们可以在console中运行上面的代码,查看结果:
irb(main):001:0> users.each{|user| puts "#{user.name}: #{user.articles.count}"}
John: 5
Michael: 3
...
上面的结果表明,John用户的文章最多,出现了5次。
我们也可以选择指定group和order属性,代码如下:
User.joins(:articles).group("users.name").order("count(*) DESC")
上述代码将根据用户名称进行分组和排序。
除了count(*),我们还可以使用min、max、sum和avg函数。例如下面这段代码将获取每个用户的文章总数:
User.joins(:articles).group("users.id").select("users.*, count(articles.id) as article_count").order("article_count DESC")
在上面的代码中,我们使用select指定了要查询的字段,并且为count(articles.id)指定了别名article_count。
(adsbygoogle = window.adsbygoogle || []).push({});
阅读更多:
总结
本文介绍了在Rails 3中使用MySQL的group by和order by子句进行关联表查询并根据出现次数进行排序的方法。这种方法对于统计分析非常有用。顺便提一下,我们也可以使用Arel构建AR查询,但是需要注意的是,Arel的查询方式与上述方式不同。