2010-06-12 53 views
4

的所有孫子我有3種型號:的Rails如何獲得ojbect

User 
has_many :questions 
has_many :corrections 
end 

Question 
has_one :correction 
belongs_to :user 
end 

Correction 
belongs_to :user 
belongs_to :question 

所以,如果用戶Bob問一個問題,然後用戶可以特里檢查它,如果它的報價錯誤的修正。

讓我們與鮑勃呆在一起,並假設他已經好心地糾正了5個其他用戶,即讓我們假設他很幸運能夠從其他用戶得到3次更正。

我希望能夠做這樣的事

@ bob.corrections_offered => 5矯正對象 @ bob.corrections_received => 3矯正對象

第一個是容易,因爲它真的只是@ bob.corrections在引擎蓋下。但我不知道如何實施後者。誰能幫忙?

UPDATE

所以,我試圖使用通過所建議的,像這樣(Oh和實際上面的問題模型在我的代碼實際上是所謂的句子。即,用戶=>句=>校正。)

has_many :sentences 
has_many :corrections_received, :through => :sentences, :class_name => 'Correction' 

,但得到了在控制檯這個錯誤

​​

所以嘗試了以下

has_many :corrections_received, :through => :sentences, :source => :correction 

,但得到

ActiveRecord::HasManyThroughSourceAssociationMacroError: Invalid source reflection macro :has_one for has_many :corrections_received, :through => :sentences. Use :source to specify the source reflection.

不知道怎麼回事錯誤...

+0

如果更換一個的has_many您HAS_ONE,它會工作。 – kikito 2010-06-13 22:06:02

回答

4

您可以在用戶模型中添加has_many through關係,像這樣

class User 
    #your usual relationships 
    has_many :corrections_received, :through => :questions, :class_name => 'Correction' 
end 
+0

hi nas即時通訊嘗試實現該錯誤。你能檢查我的問題上面的更新 – robodisco 2010-06-13 06:13:06

+0

嗨nas,謝謝你的答覆。即時通訊,雖然在這方面得到一些錯誤(見我的更新)。你能想出什麼導致這個 – robodisco 2010-06-13 06:15:07

1

通常情況下,你應該能夠:through做到這一點,但我不知道如果兩個用戶>修正關係是可能的。

無論如何,模型類中的輔助方法應該足夠簡單。像這樣的東西。

def corrections_received 
    result = Array.new 
    questions.each do |q| 
     if q.correction 
     result.push q.correction 
     end 
    end 
    result 
    end 

因爲我是這個東西的新手,更正是歡迎的!

+0

你應該總是避免這樣做。因爲像這樣的方法可以顯着影響性能,如果您有大數據集或數據增長。你必須對這樣的東西做條件的sql連接查詢,而不是獲取所有數據,然後根據一些條件丟棄它們。但在任何情況下,在這樣的東西的軌道,你可以使用'有很多通過'關係 – nas 2010-06-12 05:13:20

+0

感謝您的答覆。我想到了這一點,但根據美國國家航空航天局的答覆,我擔心表現。 – robodisco 2010-06-13 06:15:34

2

請嘗試以下方法:

has_many :corrections_received,:class_name=>'Correction',:conditions=>... 
+0

謝謝你的回覆。 – robodisco 2010-06-13 06:15:50