ran*_*ika 48 activerecord ruby-on-rails ruby-on-rails-3
无论如何我可以通过子模型()返回的项目数来订购结果(ASC
/ )吗?DESC
Jobs
@featured_companies = Company.joins(:jobs).group(Job.arel_table[:company_id]).order(Job.arel_table[:company_id].count).limit(10)
Run Code Online (Sandbox Code Playgroud)
例如:我需要打印最高职位的公司
She*_*yar 85
引入了对左外连接的支持,Rails 5
因此您可以使用外连接而不是使用它counter_cache
来执行此操作.这样您仍然可以保留具有0个关系的记录:
Company
.left_joins(:jobs)
.group(:id)
.order('COUNT(jobs.id) DESC')
.limit(10)
Run Code Online (Sandbox Code Playgroud)
查询的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
Run Code Online (Sandbox Code Playgroud)
Bil*_*han 41
如果您希望经常使用此查询,我建议您使用内置的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
Run Code Online (Sandbox Code Playgroud)
然后像使用它一样
@featured_company = Company.featured
Run Code Online (Sandbox Code Playgroud)
小智 25
就像是:
Company.joins(:jobs).group("jobs.company_id").order("count(jobs.company_id) desc")
Run Code Online (Sandbox Code Playgroud)
Tan*_*Tan 21
@ user24359正确的应该是:
Company.joins(:jobs).group("companies.id").order("count(companies.id) DESC")
Run Code Online (Sandbox Code Playgroud)
小智 6
添加到 Tan 的答案中。包括 0 个关联
Company.joins("left join jobs on jobs.company_id = companies.id").group("companies.id").order("count(companies.id) DESC")
Run Code Online (Sandbox Code Playgroud)
默认情况下,joins
使用内连接。我尝试使用left join
包含 0 关联
归档时间: |
|
查看次数: |
34060 次 |
最近记录: |