2012-01-19 55 views
2

假設我有兩個Rails模型,用戶和列表。用戶擁有多個列表並列出屬於某個用戶的列表。引用ActiveRecord中的關聯表,其中/加入調用

用戶在任何時候都有一個特定的列表。這由用戶模型中的active_list_id外鍵表示。

比方說,我想運行通過的ActiveRecord以下查詢是等效的:

SELECT * FROM users JOIN lists 
ON lists.id = users.active_list_id 

基本上我想寫這將讓每一個用戶,用她的當前活動列表一起,顯示統計信息的方法在列表完成。

該解決方案在我看來是這樣的

Users.joins(:lists).where("users.active_list_id = lists.id") 

但我似乎無法得到那個工作**,我不知道最慣用正確的解決方案是什麼樣的Rails。

我應該如何使用ActiveRecord最有效率和最有效地提取這些數據?

在此先感謝您提供的任何幫助。

編輯:上述查詢確實有效,但似乎並沒有拉出用戶記錄及其關聯列表的聯合。

+1

通常表名稱將是「用戶」和「列表」 - 這可能是你的問題? – elijah

+0

好的電話,但不是,那是我的錯誤。這些表格實際上是小寫的。爲了清晰起見,我會編輯我的問題,謝謝。 – Chazu

+0

我誤解了,問題是查詢不是表格。你是正確的,沒有大寫的查詢返回我需要的用戶,但它似乎並沒有包括列表記錄。 – Chazu

回答

1

您的帖子中有一些strangr的東西。首先是:「have_many」這就是錯誤的叫做has_many,如果它在你的模型中像你這樣寫下來的話,這可能是一個問題!那麼另一件事就是外鍵的名字!按照慣例的外鍵是以單數加上_id的關聯的名稱。當你說你想hasv user.lists外鍵必須被稱爲list_id而不是active_list_id!您可以通過在關聯中傳遞foreign_key選項來指定不常規的外鍵!這將是這樣的:

User.rb:

has_many :lists, :foreign_key => 'active_list_id' 

List.rb:

belongs_to :user, :foreign_key => 'active_list_id' 

然後你就可以說這樣的:

User.find(<id>).lists 

永遠不要使用SQL在rails中連接表!不要嘗試將PHP知識轉移到RoR 1到1,只是不!

//啊現在我明白你ceed是一個帶參數的範圍! User.rb:

scope :active_list, lambda{|list_id| where(:active_list_id => list_id)} 

然後,你可以調用User.active_list(<list_id>)所有的用戶在使用這個列表搞定!

+0

確實,那has_many是一個理性的短暫失誤,其實不像是在我的模型......並且認爲我讀了五次問題> _ <... active_list_id不是用戶和列表之間關聯中使用的外鍵,本身除列表模型上的user_id列外。它幫助我參考哪個特定列表當前處於活動狀態。這合乎邏輯嗎? – Chazu

+0

查看更新,...... – davidb

+0

乾杯,這太好了,我認爲使用範圍會使代碼保持DRYer,並且考慮到我可能會使用該範圍,這很適合該項目。非常感謝=) – Chazu

1

試試這個:

Users.includes(:lists).where("users.active_list_id = lists.id") 

你在做什麼在你的問題中加載匹配的標準,而你想要的是eager-load the association以及

的用戶雖然真的,你可能想考慮使這個單獨的協會:

class User 
    belongs_to :active_list, :class_name => :list 
end 

class List 
    has_one :user 
end 
+0

這個工作,它允許我插入結果到一個變量,然後爬過他們找到每個人的完成統計數據,並相應地排名他們。我想知道是否更好地以這種方式來做,或者讓一個查詢結果必要的字段(即添加lists.pct_completed到每個用戶記錄)......在任何情況下,感謝您的幫助。 – Chazu