我正在尝试将单个父级的多个多态关系(has_many_polymorphs plugin
)定义为相同的子级。
注意有很多观众
注意有很多编辑
观众可以是用户或群组
编辑者可以是用户或组
权限是包含note_id
,viewer_id
,viewer_type
,editor_id
,editor_type
字段的关联模型
只要我在Note模型中定义了一个has_many_polymorphs关系
,一切都按预期运行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
的定义,但它没有用。甚至没有针对ViewPermission < Permission
和EditPermission < Permission
的STI模型。
任何想法/解决方法/问题指针都表示赞赏。
Rails 2.3.0
答案 0 :(得分:0)
你不需要添加
has_many :permissions
到你的笔记。
仅供参考。我曾使用has_many_polymorphs
一次,但后来放弃它,它没有按预期工作。
您可以发布用于权限的架构吗?我的猜测是问题的根源在于,你需要在模式中有多个类型,id对,因为你在定义中有两个不同的belongs_to
。
编辑:
我看到你也在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.
答案 1 :(得分:0)
@Tamer
我得到了同样的错误。问题是has_many_polymorphs
使用群组关联在连接表中创建记录并且失败了。我将attr_accessible :note_id
,:editor_id
和:editor_type
添加到了我的Permission
课程中,之后又开始工作了。 (注意:我替换了我的模型名称。)
我没有太多关注它,但我很好奇是否有办法改变这种行为。我对这个框架相当陌生,让任何敏感的东西(如订单支付协会)被大规模分配,似乎要求自己在脚下射击。如果这解决了你的问题,如果你想出其他任何问题,请告诉我。
最佳,
史蒂夫