ruby-on-rails Rails按has_many关联的结果计数排序

webghufk  于 2023-04-08  发布在  Ruby
关注(0)|答案(7)|浏览(181)

是否可以按照子模型(Jobs)返回的项目数对结果(ASC/DESC)进行排序?

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

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

wpcxdonn

wpcxdonn1#

导轨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
icomxhvb

icomxhvb2#

如果您希望经常使用这个查询,我建议您使用内置的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
qv7cva1a

qv7cva1a3#

@user24359正确的应该是:

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

icomxhvb4#

类似于:

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

suzh9iv85#

添加到Tan的回答中。要包含0关联

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

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

l3zydbqr

l3zydbqr6#

另外,direct raw SQL从rails 6中删除了,所以你需要在Arel中 Package SQL(如果raw SQL是安全的,这意味着安全地避免使用用户输入,从而避免使用SQL injection)。
Arel.sql("count(companies.id) DESC")

ulmd4ohb

ulmd4ohb7#

Company.where("condition here...")
       .left_joins(:jobs)
       .group(:id)
       .order('COUNT(jobs.id) DESC')
       .limit(10)

相关问题