【发布时间】:2017-02-18 00:13:31
【问题描述】:
--编辑--
我想简化这个问题。 使用此模型结构:
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')
但是,rails 加入表的方式意味着我无法确定表别名是什么(如果有的话),这将按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 的答案在某些情况下有效,但我正在寻找一种更具动态性的解决方案。
【问题讨论】:
标签: ruby-on-rails arel