[英]Rails order by results count of has_many association
無論如何我可以按從子模型( Jobs
)返回的項目數對結果( ASC
/ DESC
)進行排序?
@featured_companies = Company.joins(:jobs).group(Job.arel_table[:company_id]).order(Job.arel_table[:company_id].count).limit(10)
例如:我需要在頂部打印職位最高的公司
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
如果你希望經常使用這個查詢,我建議你使用內置的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
就像是:
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")
添加到 Tan 的回答中。 包含 0 個關聯
Company.joins("left join jobs on jobs.company_id = companies.id").group("companies.id").order("count(companies.id) DESC")
默認情況下, joins
使用內部joins
。 我嘗試使用left join
來包含 0 個關聯
添加到答案中, direct raw SQL
已從 rails 6 中刪除,因此您需要將 SQL 包裝在Arel
(如果raw SQL
是安全的,則意味着通過安全避免使用用戶輸入並以此方式避免SQL injection
) .
Arel.sql("count(companies.id) DESC")
Company.where("condition here...")
.left_joins(:jobs)
.group(:id)
.order('COUNT(jobs.id) DESC')
.limit(10)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.