Rails按has_many关联的结果数量sorting

无论如何,我可以通过从儿童模型( Jobs )返回的项目数量来订购结果( ASC / DESC )吗?

 @featured_companies = Company.joins(:jobs).group(Job.arel_table[:company_id]).order(Job.arel_table[:company_id].count).limit(10) 

例如:我需要打印最高职位的公司

如果你期望经常使用这个查询,我build议你使用内置的counter_cache

 # Job Model class Job < ActiveRecord::Base belongs_to :company, counter_cache: true # ... end # add a migration add_column :company, :jobs_count, :integer, default: 0 # Company model class Company < ActiveRecord::Base scope :featured, order('jobs_count DESC') # ... end 

然后像使用它

 @featured_company = Company.featured 

Rails 5+

Rails 5中引入了对左外连接的支持,所以你可以使用外连接而不是使用counter_cache来做到这一点。 这样你仍然会保持有0关系的logging:

 Company .left_joins(:jobs) .group(:id) .order('COUNT(jobs.id) DESC') .limit(10) 

查询的SQL等价物是这个(通过调用.to_sql得到的):

 SELECT "companies".* FROM "companies" LEFT OUTER JOIN "jobs" ON "jobs"."company_id" = "companies"."id" GROUP BY "company"."id" ORDER BY COUNT(jobs.id) DESC 

就像是:

 Company.joins(:jobs).group("jobs.company_id").order("count(jobs.company_id) desc") 

@ user24359正确的一个应该是:

 Company.joins(:jobs).group("companies.id").order("count(companies.id) DESC") 

()。()。()。()。()