铁轨中的模型遍历:从孩子到兄弟姐妹的孩子

时间:2010-10-31 00:55:46

标签: 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_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(也许是时候升级?)

谢谢! 阿米特

2 个答案:

答案 0 :(得分:0)

使用has_many,通过关联另一个has_many,:through关系在rails中不起作用

而不是创建关联,您只需创建一个方法来访问Advisor的所有材料

  def materials
    sessions.collect(&:materials).flatten
  end

这将有效,但您无法链接查找此方法的查询。如果您希望能够链接查找类似@advisor.materials.find..的方法,那么在此方法中使用 Material.find()并使用适当的条件

答案 1 :(得分:0)

  

我想从顾问那里走过去   所有相关材料

除非我遗漏了某些内容,使用第一个示例中指定的关联,否则只需在关联的materials上调用course

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