Rails has_many:通过命名空间 - 未初始化的常量

时间:2017-11-29 20:18:09

标签: ruby-on-rails rails-activerecord

我在使用Rails 5中的has_many:through关系时遇到一些麻烦,其中连接和目标模型都位于命名空间内。我有一个Student模型,我希望通过Admission::Application加入Admission::ApplicationStudent。当我尝试访问admission_applications关联时,我得到一个NameError:“未初始化的常量Student :: Application”。

以下是我的模型定义:

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

收/ application_student.rb

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

收/ application.rb中

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

顺便说一句,我使用标准命令生成了所有三个模型:

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

来自application_students的{​​{1}}和students关联都正常运作。我还可以从Application上的ApplicationStudent关联中检索admission_application_students条记录的集合。如果Student知道如何做到这一点,似乎Student似乎是问题,但我从昨天开始一直在研究和测试,我不再觉得我正在取得进展。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

您需要为class_name关联指定admission_applications,因为它也位于不同的命名空间中:

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

有关详细信息,请参阅has_many的文档和第{3.4节控制Active Record Associations Guide的关联范围。