2017-02-18 40 views
9

- 編輯 -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--

鍋的回答工作在某些情況下,但我要尋找一個解決方案,更加動感一些。

回答

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) 

想法是創建你自己的別名,而加入表

+0

問題在於我沒有自己加入。我正在使用稱爲filterrific的寶石。我會認爲必須有一種方法來從'current_scope'獲取別名? – Rick

+0

我已經給了你賞金,因爲你的答案與我之後的答案更接近,但它絕不是我尋找的理想解決方案。 – Rick

5

使用協會名稱爲多個當前表名串聯爲一個表別名名稱訂單號方法:

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

我瞭解Rails如何生成別名,但假設訂單部分設置爲範圍,並且我不知道表已加入哪個訂單。我可以使用這個靜態文本''pickup _jobs_packages.name desc'',但如果pickup pickup首先加入,那將會失敗。我可以將訂單文本更改爲''jobs.name desc'',但這將始終在第一次加入時排序。 – Rick

相關問題