我有以下型号:
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 :(得分: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