Rails将结果多次连接到同一个表

时间:2017-02-18 00:13:32

标签: ruby-on-rails arel

- 编辑 -

我想简化这个问题。 有了这个模型结构:

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"

此外,我无法控制表的连接方式,因此我无法定义表别名。

- UPDATE -

我尝试使用类似的东西从当前范围中提取别名:

current_scope.join_sources.select { |j| j.left.table_name == 'locations' }

但我仍然有点卡住,并且真的觉得应该有更简单的解决方案。

- UPDATE -

潘的答案适用于某些情况,但我正在寻找一种更具动态性的解决方案。

2 个答案:

答案 0 :(得分:5)

order 方法中使用关联名称(多个当前表名称)的串联作为表别名:

Package.joins(:dropoff_job, :pickup_job).order('pickup_jobs_packages.name desc')

答案 1 :(得分:0)

您可以尝试这样的事情

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)

想法是在加入表格时创建自己的别名

相关问题