代码之家  ›  专栏  ›  技术社区  ›  AmitA

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

  •  0
  • AmitA  · 技术社区  · 15 年前

    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 回复  |  直到 15 年前
        1
  •  0
  •   zetetic    15 年前

    我想从一个顾问到

    除非我遗漏了一些东西,使用第一个示例中指定的关联,您可以简单地调用 materials 关于关联的 course

    a = Advisor.first
    materials = a.course.materials
    
        2
  •  0
  •   Rishav Rastogi    15 年前

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

    与其创建关联,不如创建一个方法,由顾问访问所有材料

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

    @advisor.materials.find.. 然后在这个方法里面使用 Material.find() 在适当的条件下