- 編輯 -Rails將多個連接的結果排序到同一表
我想簡化此問題。 有了這個模型的結構:
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--
鍋的回答工作在某些情況下,但我要尋找一個解決方案,更加動感一些。
問題在於我沒有自己加入。我正在使用稱爲filterrific的寶石。我會認爲必須有一種方法來從'current_scope'獲取別名? – Rick
我已經給了你賞金,因爲你的答案與我之後的答案更接近,但它絕不是我尋找的理想解決方案。 – Rick