Ruby on rails rails中的模型遍历:从子级到兄弟级的子级

Ruby on rails rails中的模型遍历:从子级到兄弟级的子级,ruby-on-rails,activerecord,has-many-through,Ruby On Rails,Activerecord,Has Many Through,我有以下型号: 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_

我有以下型号:

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
但它不起作用,因为它将会话视为一个多对多表:“where子句”中的未知列“sessions.advisor\u id”:选择“material”。*从“materials”的“materials”内部连接“sessions”。sessions\u id=“sessions”。id其中“sessions”。advisor\u id=1

然后我试着做:

class Advisor < ActiveRecord::Base
  belongs_to :course
  has_many :sessions, :through=>:course
  has_many :materials, :through=>:sessions
end
class Advisor < ActiveRecord::Base
  belongs_to :course
  has_many :materials, :through=>:course
end
尝试使用会话作为源,这是一个很好的尝试,但使我只收到会话而不是材料

如果可能的话,有什么想法吗? 我正在使用Rails 2.3.8,也许是时候升级了

谢谢!
Amit

使用has\u many,通过关联另一个has\u many:through relation在rails中不起作用

您只需创建一个方法,即可通过Advisor访问所有材质,而无需创建关联

def materials sessions.collect(&:materials).flatten end
这将起作用,但您将无法将find查询链接到此方法。如果您希望能够链接查找方法,例如@advisor.materials.find。。然后在此方法中使用Material.find,在适当的条件下使用has\u many,通过关联查找另一个has\u many:通过关联在rails中不起作用

您只需创建一个方法,即可通过Advisor访问所有材质,而无需创建关联

def materials sessions.collect(&:materials).flatten end 这将起作用,但您将无法将find查询链接到此方法。如果您希望能够链接查找方法,例如@advisor.materials.find。。然后在这个方法中使用Material.find,并使用适当的条件

我想从一名顾问过渡到 所有相关材料

除非我遗漏了什么,否则使用第一个示例中指定的关联,您只需调用关联课程的材料:

我想从一名顾问过渡到 所有相关材料

除非我遗漏了什么,否则使用第一个示例中指定的关联,您只需调用关联课程的材料:

a = Advisor.first
materials = a.course.materials