2010-10-31 51 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