2017-11-29 2 views
0

Ich habe einige Probleme bei der Definition einer has_many: through-Beziehung in Rails 5, wo die Join-und Zielmodelle beide in einem Namespace befinden. Ich habe ein Student Modell, das ich zu Admission::Application durch Admission::ApplicationStudent beitreten möchte. Wenn ich versuche, auf die admission_applications Verbindung zuzugreifen, erhalte ich einen NameError: "nicht initialisierte Konstante Student :: Application".Rails has_many: through mit Namespace - nicht initialisierte Konstante

Hier sind meine Modelldefinitionen:

student.rb

class Student < ApplicationRecord 
    has_many :admission_application_students, 
    class_name: 'Admission::ApplicationStudent', 
    inverse_of: :student 
    has_many :admission_applications, 
    through: :admission_application_students, 
    source: :application 
end 

Eintritt/application_student.rb

class Admission::ApplicationStudent < ApplicationRecord 
    belongs_to :application 
    belongs_to :student, 
    class_name: 'Student', 
    inverse_of: :admission_application_students 
end 

Eintritt/application.rb

Übrigens
class Admission::Application < ApplicationRecord 
    has_many :application_students 
    has_many :students, 
    through: :application_students, 
    source: :student 
end 

, I erzeugt alle drei Modelle mit Standardbefehle:

rails g model student 
rails g model 'Admission::Application' 
rails g model 'Admission::ApplicationStudent' 

Die application_students und students Verbände sind beide korrekt von Application funktionieren. Ich kann auch eine Sammlung von ApplicationStudent Aufzeichnungen von der admission_application_students Vereinigung auf Student abrufen. Wenn Student weiß, wie man es so weit macht, scheint es, als hätte :source das Problem zu sein, aber ich habe seit gestern recherchiert und getestet, und ich habe nicht mehr das Gefühl, dass ich Fortschritte mache. Jede Hilfe wäre willkommen.

Antwort

1

Sie benötigen die class_name für admission_applications Verein angeben, da es auch in einem anderen Namespace ist:

class Student < ApplicationRecord 
    has_many :admission_application_students, class_name: 'Admission::ApplicationStudent' 
    has_many :admission_applications, 
       through: :admission_application_students, 
        source: :application, 
       class_name: 'Admission::Application' 
end 

Weitere Informationen in der Dokumentation zu has_many und Abschnitt 3.4 Controlling Vereinigung Umfang des Active Record Associations Guide sehen.

+0

Sie sind absolut richtig und ich danke Ihnen. Ich könnte schwören, dass ich irgendwo gelesen habe: class_name wird ignoriert, wenn: source verwendet wird. Bin ich verrückt zu denken, dass der Klassenname hier hergeleitet werden könnte? ApplicationStudent kann bereits die Anwendungszuordnung auflösen, auf die verwiesen wird: source. Das fühlt sich wie ein seltener Zusammenbruch der Magie von Rails an. – allknowingfrog

Verwandte Themen