Modell-Traversal in Schienen: vom Kind zum Geschwister des Kindes
-
27-09-2019 - |
Frage
Ich habe folgendes Modell:
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
d., Lehrt jeder Berater einen Kurs, jeder Kurs Sitzungen hat, und jede Sitzung hat Materialien.
Ich möchte von einem Berater zu allen zugehörigen Materialien, das heißt so etwas wie verfahren: Advisor.first.materials
Ich habe versucht zu tun:
class Advisor < ActiveRecord::Base
belongs_to :course
has_many :sessions, :through=>:course
has_many :materials, :through=>:sessions
end
Aber es hat nicht funktioniert, wie es Sitzungen als many-to-many-Tabelle behandelt: 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))
Ich habe dann versucht, zu tun:
class Advisor < ActiveRecord::Base
belongs_to :course
has_many :materials, :through=>:course
end
In einem Versuch, den Verein Verwendung hat den „Materialien“ Verein in dem „Kurs“ -Modell, aber erhalten:
ActiveRecord::HasManyThroughSourceAssociationMacroError: Invalid source reflection on macro :has_many :through for has_many :materials, :through=>:sessions. Use :source to specify the source reflection.
Versucht, Verwendung „Sitzungen“ als Quelle, die ein netter Versuch war aber machte ich erhalte nur die Sitzungen statt den Materialien.
Alle Ideen, wenn dies überhaupt möglich ist? Ich bin mit Rails 2.3.8 (vielleicht Zeit für ein Upgrade?)
Danke! Amit
Lösung
Ich möchte von einem Berater durchqueren zu alle zugehörigen Materialien
Es sei denn, ich etwas fehle, die Assoziationen mit in Ihrem ersten Beispiel angegeben, können Sie einfach materials
auf dem zugehörigen course
nennen:
a = Advisor.first
materials = a.course.materials
Andere Tipps
Mit einem has_many, durch die Verbindung für einen anderen has_many,: durch Beziehung nicht funktionieren wird in Schienen
anstelle einer Assoziation erstellen, können Sie nur eine Methode, um Zugang zu allen Materialien erstellen, indem Sie einen Berater
def materials sessions.collect(&:materials).flatten end
Das wird funktionieren, aber Sie werden nicht auf diese Methode zu finden Kette Abfragen der Lage sein. Wenn Sie möchten, dann mit geeigneten Bedingungen innerhalb dieser Methode Gebrauch @advisor.materials.find..
Ketten find-Methoden so etwas wie Material.find()
der Lage sein,