Ric*_*ick 9 ruby-on-rails arel
- 编辑 -
我想简化这个问题.有了这个模型结构:
has_one :pickup_job, class_name: 'Job', source: :job
has_one :dropoff_job, class_name: 'Job', source: :job
Run Code Online (Sandbox Code Playgroud)
我想做的是:
Package.joins(:dropoff_job, :pickup_job).order(pickup_job: {name: :desc})
Run Code Online (Sandbox Code Playgroud)
这显然无效,应该使用的实际语法是:
.order('jobs.name desc')
Run Code Online (Sandbox Code Playgroud)
但是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"
Run Code Online (Sandbox Code Playgroud)
此外,我无法控制表的连接方式,因此我无法定义表别名.
--UPDATE--
我尝试使用以下内容从当前作用域中提取别名:
current_scope.join_sources.select { |j| j.left.table_name == 'locations' }
Run Code Online (Sandbox Code Playgroud)
但我仍然有点卡住,真的觉得应该有一个更简单的解决方案.
--UPDATE--
潘的答案适用于某些情况,但我正在寻找一个更有活力的解决方案.
小智 5
使用复数和当前表名中的关联名称串联作为order方法中的表别名:
Package.joins(:dropoff_job, :pickup_job).order('pickup_jobs_packages.name desc')
Run Code Online (Sandbox Code Playgroud)
小智 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)
Run Code Online (Sandbox Code Playgroud)
想法是在加入表时创建自己的别名
归档时间: |
|
查看次数: |
1099 次 |
最近记录: |