时创建自己的别名
- 编辑 -
我想简化这个问题。使用此模型结构:
has_one :pickup_job, class_name: 'Job', source: :job
has_one :dropoff_job, class_name: 'Job', source: :job
我想做的是:
Package.joins(:dropoff_job, :pickup_job).order(pickup_job: {name: :desc})
这显然无效,应使用的实际语法是:
.order('jobs.name desc')
然而,轨道连接表的方式意味着我无法确保表格名称是什么(如果有的话),这将通过 dropoff_job.name
而不是 pickup_job.name
irb(main):005:0> Package.joins(:dropoff_job, :pickup_job).order('jobs.name desc').to_sql
=> "SELECT "packages".* FROM "packages" INNER JOIN "jobs" ON "jobs"."id" = "packages"."dropoff_job_id" INNER JOIN "jobs" "pickup_jobs_packages" ON "pickup_jobs_packages"."id" = "packages"."pickup_job_id" ORDER BY jobs.name desc"
我也无法控制表格的连接方式,因此我无法定义表格别名。
- 更新 -
我曾尝试使用类似的内容从当前范围中提取别名名称:
current_scope.join_sources.select { |j| j.left.table_name == 'locations' }
,但仍然有点卡住,真的感觉应该有一个更简单的解决方案。
- 更新 -
pan的答案在某些情况下有效,但我正在寻找一种更具动态的解决方案。
使用复数和当前表名称中的关联名称的串联作为表格顺序中的表个名称EM>方法:
Package.joins(:dropoff_job, :pickup_job).order('pickup_jobs_packages.name desc')
您可以尝试这样的东西
Package.joins("INNER JOIN locations as dropoff_location ON dropoff_location.id = packages.dropoff_location_id INNER JOIN locations as pickup_location ON pickup_location.id = packages.pickup_location_id)
想法是在加入表格