2017-02-28 65 views
0

遇到我以前沒有遇到的問題,並且似乎無法在任何地方找到解決方案,令人沮喪。基本上我有一個用戶表,其中包含一個invited_by_id列,引用相同的用戶表。導軌 - 通過自我指示排序包括

現在我想創建一個查詢它排序基礎上,邀請用戶名的成績,但是使用通常的活動記錄在這裏整理並未真正發揮作用

User 
.includes(:invited_by) 
.order("users.name ASC") 

因爲無論是表有問題的是同一個,似乎鐵軌選擇第一個,而不是invite_by協會。

有沒有什麼方法可以指定我想要在關聯上訂購?

更多信息

我試圖在一個活動記錄混入使用這一點,所以我不會在基類中直接調用此,它需要與現有的範圍,因爲混合工作方法將在範圍上調用。例如

User 
.includes(:invited_by) 
.where(where_clause) 
.sort(:invited_by_name, :asc) 

這裏,sort方法由混入提供,並且這是它需要能夠在表之間進行區分。我有邏輯,這意味着它知道關係是什麼,所以它知道:invited_by_name是:invite_by關係的名稱列,但是就我而言。

回答

0

您需要引用同一張表作爲不同的名稱。你可以用Arel做到這一點

guest = Arel::Table.new(:users, :as => 'guest') 
inviter = Arel::Table.new(:users, :as => 'inviter') 

relation = guest. 
    project(Arel.sql('*')). 
    join(inviter).on(guest[:invited_by_id].eq(inviter[:id])). 
    order(inviter[:name]) 

@users = relation.to_sql 
+0

這是否與現有的範圍工作?這將是一個混合內部鏈接,所以需要與現有的範圍,而不是直接用戶模型 – PaReeOhNos

+0

嗯,不,我看不到它的工作,甚至想象如何嘗試它。我剛剛用範圍搜索了Arel,並沒有看到任何可用的東西。有關於更改Arel節點的博客條目,但我不確定這對您有多大幫助... https://www.viget.com/articles/composable-sql-queries-in-rails-using-arel – SteveTurczyn

+0

嗯沒有這是我的問題:(將繼續挖掘 – PaReeOhNos