2010-10-31 35 views
0

我有以下型號:型號遍歷軌道:從小孩到兄弟姐妹的孩子

class Advisor < ActiveRecord::Base 
    belongs_to :course 
end 

class Course < ActiveRecord::Base 
    has_many :advisors 
    has_many :sessions 
    has_many :materials, :through=>:sessions 
end 

class Session < ActiveRecord::Base 
    belongs_to :course 
    has_many :materials 
end 

class Material < ActiveRecord::Base 
    belongs_to :session 
end 

即每個顧問講授一門課程,每門課程都有會話,每個會話都有材料。 我想從一個顧問的所有相關材料,即橫貫東西,如:Advisor.first.materials 我試圖做的:

class Advisor < ActiveRecord::Base 
    belongs_to :course 
    has_many :sessions, :through=>:course 
    has_many :materials, :through=>:sessions 
end 

但是,因爲它處理會話作爲一個多到多臺沒有奏效:Unknown column 'sessions.advisor_id' in 'where clause': SELECT 'material'.* FROM 'materials' INNER JOIN 'sessions' ON 'materials'.session_id = 'sessions'.id WHERE (('sessions'.advisor_id = 1))

然後我試圖做的:

class Advisor < ActiveRecord::Base 
    belongs_to :course 
    has_many :materials, :through=>:course 
end 

在試圖擁有該協會使用「材料」協會在「場」的模式,但收到:

ActiveRecord::HasManyThroughSourceAssociationMacroError: Invalid source reflection on macro :has_many :through for has_many :materials, :through=>:sessions. Use :source to specify the source reflection. 

試圖使用「會議」作爲源,這是一個不錯的嘗試,但讓我只接收會議,而不是材料。

任何想法,如果這是可能的? 我正在使用Rails 2.3.8(也許是時間升級?)

謝謝! 阿米特

回答

0

我想從一個顧問遍歷 所有相關材料

除非我中號失去了一些東西,用你的第一個例子中指定的關聯,你可以簡單地調用materials在相關course

a = Advisor.first 
materials = a.course.materials 
+0

你是對的,我很愚蠢的錯過了......謝謝! – AmitA 2010-10-31 16:31:34

0

使用的has_many,通過協會的另一個的has_many,:通過關係將不會在軌

,而不是創建一個協會工作,你可以只創建一個顧問

訪問所有的材料的方法
 
    def materials 
    sessions.collect(&:materials).flatten 
    end 

這將工作,但你不能鏈查找到這種方法。如果您希望能夠鏈查找方法類似@advisor.materials.find..然後在此方法中使用Material.find()有適當的條件下

+0

謝謝Rishav,這也適用! – AmitA 2010-10-31 16:32:15

相關問題