ruby-on-rails - Rails订单结果与多个联接到同一个表

标签 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"

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

- 更新 -

我在尝试使用类似这样的方法从当前作用域中提取别名:
current_scope.join_sources.select { |j| j.left.table_name == 'locations' }

但是仍然有些卡住,真的感觉应该有一个更简单的解决方案。

- 更新 -

pan的答案在某些情况下有效,但我正在寻找更具动态性的解决方案。

最佳答案

在order方法中,将复数形式的关联名称和当前表名称的连接用作表别名:

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

关于ruby-on-rails - Rails订单结果与多个联接到同一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42309530/

相关文章:

sql - 使用 JOIN 和 LIKE 的 Rails OR 查询

ruby-on-rails - Rails/Arel - 组合 AREL 谓词时的优先级

ruby-on-rails - Arel::SelectManager 如何访问包括投影在内的结果

ruby-on-rails - 在 ruby​​ on rails 中,如何将 ActiveSupport::TimeWithZone 中的时间转换为月、日、年?

javascript - 从前端向 API 服务器发送密码的最佳做法是什么?

mysql - 如何在 Rails 中对整数属性执行匹配查询

ruby - Rails3 Arel 访问自定义类

ruby-on-rails - 奇怪的 Rails 路由行为 : two ids swapped around in nested resources

ruby-on-rails - 在 Rails 应用程序中随处访问对象

html - 为什么我的搜索栏中的占位符文本没有出现在 Firefox 中