MySQL Rails 3 ActiveRecord: Order by count on association错误


<!–

–>

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的查询方式与上述方式不同。