Я пытаюсь определить несколько полиморфных отношений (has_many_polymorphs plugin
) от одного родителя к одним и тем же детям.
Заметка имеет много зрителей
Заметка имеет много редакторов
Зрителями могут быть пользователи или группы.
Редакторами могут быть пользователи или группы.
Разрешение - это модель ассоциации с полями note_id
, viewer_id
, viewer_type
, editor_id
, editor_type
Все работает, как и ожидалось, пока у меня только одно отношение has_many_polymorphs, определенное в модели Note
class User < ActiveRecord::Base; end
class Group < ActiveRecord::Base; end
class Note < ActiveRecord::Base
has_many_polymorphs :viewers, :through => :permissions, :from => [:users, :groups]
end
class Permission < ActiveRecord::Base
belongs_to :note
belongs_to :viewer, :polymorphic => true
end
Note.first.viewers << User.first # => [#<User id: 1, ....>]
Note.first.viewers << Group.first # => [#<User id: 1, ....>, #<Group ...>]
Note.first.viewers.first # => #<User ....>
Note.first.viewers.second # => #<Group ....>
Теперь проблемы начинают появляться, когда я добавляю второе отношение
class Note < ActiveRecord::Base
has_many_polymorphs :viewers, :through => :permissions, :from => [:users, :groups]
has_many_polymorphs :editors, :through => :permissions, :from => [:users, :groups]
end
class Permission < ActiveRecord::Base
belongs_to :note
belongs_to :viewer, :polymorphic => true
belongs_to :editor, :polymorphic => true
end
Note.first.viewers << User.first # => [#<User id: ....>]
# >>>>>>>>
Note.first.editors << User.first
NoMethodError: You have a nil object when you didn't expect it!
The error occurred while evaluating nil.constantize
... vendor/plugins/has_many_polymorphs/lib/has_many_polymorphs/base.rb:18:in `instantiate'
Я пытался уточнить определение has_many_polymorphs
, но оно не сработало. Даже с моделью STI для ViewPermission < Permission
и EditPermission < Permission
.
Любые мысли / обходные пути / указатели проблем приветствуются.
Рельсы 2.3.0