是否可以使用GROUP和COUNT来获取一个表的列表,其中包含来自第二个表的COUNT个记录在ActiveRecord中?

时间:2016-05-17 02:38:22

标签: ruby-on-rails ruby-on-rails-4

对于模糊的问题,我很抱歉,我不知道该怎么回答。

假设您有两个模型,OwnerArticleOwner可以包含多个Articles。我想要一个包含Owner模型内容的列表,以及与每个Articles对应的Owner计数。

看起来像这样:

owner_id | Name | COUNT
-----------------------
|     1  | Tom  |  20
|     2  | Bob  |  10
|     3  | Karl |   5
|     4  | Bart |  24
|     5  | Zack |   0

目前我已尝试执行以下操作:

Owner.joins(:articles).select('id_owner, owner.name, COUNT(owner.id_owner)')
                      .group(:id_owner).order('count(articles.id_article) desc')

这是有效的,但有一种更简单的方法可以用ActiveRecord来表达吗?我觉得在select中将其分解为SQL有点像hacky,也许别无他法?

1 个答案:

答案 0 :(得分:1)

如果您不介意在articles_count表格中添加一个额外的字段owners,那么您可以使用AR counter_cache

class Owner < ActiveRecord::Base
  has_many :articles
end

class Articles < ActiveRecord::Base
  belongs_to :owner, counter_cache: true
end

然后,AR会自动更新articles_count表格上的owners列,并且您始终拥有关联的所有者文章计数,而不会对您的数据库造成压力。

至于您的原始问题,我不认为AR有一个界面可以让您从另一个表格中添加 COUNT(field)字段到您的模型。