2010-10-31 20 views
0

je le modèle suivant:traversal dans des rails: de l'enfant à l'enfant des frères et sœurs

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 

à savoir, chaque conseiller enseigne un cours, chaque cours a des séances, et chaque session a des matériaux. Je veux traverser d'un conseiller à tous les matériaux associés, à savoir quelque chose comme: Advisor.first.materials J'ai essayé de le faire:

class Advisor < ActiveRecord::Base 
    belongs_to :course 
    has_many :sessions, :through=>:course 
    has_many :materials, :through=>:sessions 
end 

Mais cela n'a pas fonctionné comme elle a traité des séances comme plusieurs à table n : 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))

J'ai ensuite essayé de le faire:

class Advisor < ActiveRecord::Base 
    belongs_to :course 
    has_many :materials, :through=>:course 
end 

pour tenter d'avoir l'association utilise l'association des « matériaux » dans le modèle « cours », mais a reçu:J'ai essayé d'utiliser "sessions" comme source, ce qui a été un bon essai mais m'a fait recevoir seulement les sessions plutôt que les matériaux.

Toutes les idées si cela est possible? J'utilise Rails 2.3.8 (peut-être le temps de mettre à niveau?)

Merci! Amit

Répondre

0

Je veux traverser d'un conseiller pour tous les matériaux associés

À moins que je m manque quelque chose, en utilisant les associations spécifiées dans votre premier exemple, vous pouvez simplement appeler materials sur le associé course:

a = Advisor.first 
materials = a.course.materials 
+0

Vous avez raison, si bête de moi d'avoir raté ça .. Merci! – AmitA

0

L'utilisation d'un has_many, par association pour un autre has_many,: par rapport ne fonctionnera pas dans des rails

au lieu de créer une association, vous pouvez simplement créer une méthode pour accéder à tous les matériaux par un conseiller

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

Cela fonctionnera, mais vous ne serez pas en mesure d'enchaîner les requêtes à cette méthode. Si vous voulez être en mesure d'enchaîner les méthodes de trouver quelque chose comme @advisor.materials.find.. ensuite à l'intérieur de cette méthode utilisation Material.find() avec des conditions appropriées

+0

Merci Rishav, ça marche aussi! – AmitA