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

War es hilfreich?

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,

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top