Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails has_many :through with namespace - uninitialized constant

I'm having some trouble defining a has_many :through relationship in Rails 5 where the join and target models both reside within a namespace. I have a Student model that I want to join to Admission::Application through Admission::ApplicationStudent. When I attempt to access the admission_applications association I get a NameError: "uninitialized constant Student::Application".

Here are my model definitions:

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

admission/application_student.rb

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

admission/application.rb

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

Incidentally, I generated all three models with standard commands:

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

The application_students and students associations are both functioning correctly from Application. I can also retrieve a collection of ApplicationStudent records from the admission_application_students association on Student. If Student knows how to make it that far, it seems like :source has to be the problem, but I've been researching and testing since yesterday, and I no longer feel like I'm making progress. Any help would be appreciated.

like image 801
allknowingfrog Avatar asked Nov 29 '17 20:11

allknowingfrog


1 Answers

You need to specify the class_name for admission_applications association since it is also in a different namespace:

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

For more information see the documentation for has_many and Section 3.4 Controlling Association Scope of the Active Record Associations Guide.

like image 191
s3tjan Avatar answered Nov 19 '22 18:11

s3tjan