2014-12-19 106 views
0

好的,所以創建了2個模型User和Following。用戶具有用戶名屬性並且以下具有2個用戶關聯屬性:user_id,following_user_id。我在各自的模型中建立了這些關聯,並且所有作品都很好。Rails ActiveRecord如何通過自定義命名關聯來訂購

class User < ActiveRecord::Base 
    has_many :followings, dependent: :destroy 
    has_many :followers, :class_name => 'Following', :foreign_key => 'following_user_id', dependent: :destroy 
end 

class Following < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :following_user, :class_name => 'User', :foreign_key => 'following_user_id' 
end 

現在我需要通過用戶名執行ActiveRecord查詢時的結果。

Following.where(:user_id => 47).includes(:user).order("users.username ASC") 

問題是我:我可以爲直線上升者協會(USER_ID)用下面的代碼將返回到我由屬於關聯的用戶名下令追隨中的列表,以user_id說明輕鬆地實現這個無法達到由另一個關聯(following_user_id)排序的相同結果。我已經加入該協會的.includes電話,但因爲活動記錄是尋找在桌子上的關聯題爲following_users

Following.where(:user_id => 47).includes(:user => :followers).order("following_users.username ASC") 

我試圖在.order呼叫改變協會的名字名字,我得到一個錯誤我在用戶模型中作爲追隨者設置,但沒有任何工作,它仍然在尋找具有這些標題的表格。我也嘗試了user.username,但是這將基於其他關聯進行排序,例如在第一個示例中。

如何通過following_user.username來訂購ActiveRecord結果?

回答

2

這是因爲您的SQL查詢中沒有following_users表。

您需要手動加入它像這樣:

Following. 
joins(" 
    INNER JOIN users AS following_users ON 
    following_users.id = followings.following_user_id 
"). 
where(user_id: 47). # use "followings.user_id" if necessary 
includes(user: :followers). 
order("following_users.username ASC") 

爲了獲取沒有一個following_user_id,只需使用OUTER JOINFollowing行。

或者,你可以在Ruby中做到這一點,而不是SQL,如果你能承受的速度和內存成本:

Following. 
where(user_id: 47). # use "followings.user_id" if necessary 
includes(:following_user, {user: :followers}). 
sort_by{ |f| f.following_user.try(:username).to_s } 

僅供參考:這try處於失蹤following_user的情況下和to_s是確保比較字符串進行排序。否則,nilString相比會崩潰。

+0

工程就像一個魅力!謝謝! –

相關問題