0

Я хотел сделать полиморфную ассоциацию в своем проекте, поэтому я следую за направляющими рельсов, но я получил: NameError: uninitialized constant DashboardAssignment::Assignable ошибка.Полиморфизм в неинициализированной константе Rails

Модели:

DashboardAssignment:

class DashboardAssignment < ActiveRecord::Base 
    belongs_to :dashboard 
    belongs_to :assignable, polymorphic: true 

    validates :dashboard, presence: true 
    validates :assignable, presence: true, uniqueness: { :scope => :dashboard } 
end 

Пользователь:

class User < ActiveRecord::Base 
    has_many :dashboard_assignments, as: :assignable 
    has_many :dashboards, through: :dashboard_assignments 
end 

Группа:

class Group < ActiveRecord::Base 
    has_one :dashboard_assignment, as: :assignable 
    has_many :laboratories_assignments, as: :lab_assignable 
end 

Dashboard :

class Dashboard < ActiveRecord::Base 
    has_one :building 
    has_many :dashboard_assignments 
    has_many :users, through: :dashboard_assignments, as: :assignable 
end 

В DashboardAssignment миграции файл у меня есть:

t.references :assignable, null: false, polymorphic: true, index: true 

Когда я пытаюсь создать новый DashboardAssignment по DashboardAssignment.create(assignable: u) где u = User.find(1) он дает мне ошибку:

NameError: uninitialized constant DashboardAssignment::Assignable 
    from P:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/activerecord-4.2.6/lib/active_record/inheritance.rb:158:in `compute_type' ... 

Am I что-то не так?

Моя Рельсы версия 4.2.6

+0

Что ошибка говорят вам, что нет атрибута или ассоциации под названием присваивается классу DashboardAssignment. Можете ли вы, пожалуйста, разместить свою модель приборной панели, пожалуйста? –

+0

ОК. добавлена ​​модель Dashboard – Levvy

+0

Я уверен, ваша проблема существует из-за: has_many: пользователи через:: dashboard_assignments, as:: assignable – bpieck

ответ

1

Вы должны использовать source вместо as в through ассоциации

class Dashboard < ActiveRecord::Base 
    has_one :building 
    has_many :dashboard_assignments 
    has_many :users, through: :dashboard_assignments, source: :assignable 
end 

Я хотел бы предостеречь, однако, что это может дать вам assignables, которые имеют класс Group. Лучший способ обойти этот вопрос путем добавления условия к has_many для dashboard_assignments что давайте фильтровать только для dashboard_assignments, которые имеют assignable_type = 'User':

class Dashboard < ActiveRecord::Base 
    has_one :building 
    has_many :user_dashboard_assignments, -> { where(assignable_type: 'User') }, class_name: 'DashboardAssignment' 
    has_many :users, through: :user_dashboard_assignments, source: :assignable 
end 
+0

Я попытался изменить эти строки, но такая же ошибка все еще происходит. Мой проект открыт с открытым исходным кодом: https://github.com/GRM-dev/IMP/tree/Polimorphic на полиморфной ветке – Levvy

+0

Ahhh, вероятно, была моей ошибкой :) В DashboardAssignment у меня была строка 'validates: assignable, presence: true, uniqueness: {: scope =>: dashboard} ' Когда я удалил его и изменил' as: 'на' source: 'все кажется, работает нормально. Также добавлен 'source_type:« Пользователь »' в эту строку. – Levvy