62

无论如何我可以按从子模型()返回的项目数对结果( ASC/ )进行排序吗?DESCJobs

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

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

4

7 回答 7

118

导轨 5+

引入了对左外连接的支持,Rails 5因此您可以使用外连接而不是使用counter_cache来执行此操作。这样,您仍将保留具有 0 个关系的记录:

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
于 2017-03-17T01:07:19.423 回答
47

如果您希望经常使用此查询,我建议您使用内置的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
于 2013-06-08T06:58:43.653 回答
26

就像是:

Company.joins(:jobs).group("jobs.company_id").order("count(jobs.company_id) desc")
于 2013-06-08T06:17:48.917 回答
26

@user24359 正确的应该是:

Company.joins(:jobs).group("companies.id").order("count(companies.id) DESC")
于 2015-11-10T04:33:08.383 回答
5

添加到谭的答案。包含 0 个关联

Company.joins("left join jobs on jobs.company_id = companies.id").group("companies.id").order("count(companies.id) DESC")

默认情况下,joins使用内部联接。我尝试使用left join包含 0 关联

于 2019-05-21T03:56:58.977 回答
0

添加到答案中,direct raw SQL已从 rails 6 中删除,因此您需要将 SQL 包含在内部Arel(如果raw SQL通过安全避免使用用户输入并以这种方式避免使用 SQL 是安全的SQL injection)。

Arel.sql("count(companies.id) DESC")

于 2020-12-30T00:41:23.027 回答
-4
Company.where("condition here...")
       .left_joins(:jobs)
       .group(:id)
       .order('COUNT(jobs.id) DESC')
       .limit(10)
于 2017-07-25T10:31:45.030 回答