Несколько has_many_polymorphs в одной модели - PullRequest
0 голосов
/ 11 июня 2009

Я пытаюсь определить несколько полиморфных отношений (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

Ответы [ 2 ]

0 голосов
/ 27 июня 2009

@ Укротитель

Я получаю ту же ошибку. Проблема заключалась в том, что has_many_polymorphs создает запись в объединяющей таблице с использованием массового сопоставления и не работает. Я добавил attr_accessible :note_id, :editor_id и :editor_type в свой класс Permission, и это сработало впоследствии. (Примечание: я заменил ваши названия моделей на мои.)

Я не слишком углублялся в это, но мне было бы любопытно, если есть способ изменить это поведение. Я довольно новичок в этой структуре, и позволить массовому назначению чего-нибудь чувствительного (например, ассоциации «Заказ-оплата») похоже на просьбу выстрелить себе в ногу. Дайте мне знать, если это решило вашу проблему, и если вы решите что-нибудь еще.

Бест,
Стив

0 голосов
/ 11 июня 2009

Не нужно добавлять

has_many :permissions

к вашей заметке. FYI. Я использовал has_many_polymorphs один раз, но потом уронил его, он не работал, как ожидалось.

Можете ли вы опубликовать схему, которую вы используете для Разрешения? Я предполагаю, что корень проблемы лежит здесь, вам нужно иметь несколько типов ID пары в схеме, так как у вас есть две разные belongs_to в определении.

Edit:

Я вижу, вы также разместили вопрос на github. Не уверен, что вы пытались использовать двусторонний полиморфизм. Вероятно, у вас есть ... как я уже сказал, я не был впечатлен этим плагином, так как он привел к некоторой нестабильности при использовании.

== Double-sided polymorphism

Double-sided relationships are defined on the join model:

      class Devouring < ActiveRecord::Base
        belongs_to :guest, :polymorphic => true
        belongs_to :eaten, :polymorphic => true

        acts_as_double_polymorphic_join(
          :guests =>[:dogs, :cats], 
          :eatens => [:cats, :birds]
        )       
      end


Now, dogs and cats can eat birds and cats. Birds can't eat anything (they aren't <tt>guests</tt>) and dogs can't be 
eaten by anything (since they aren't <tt>eatens</tt>). The keys stand for what the models are, not what they do. 
...