一个模型中有多个has_many_polymorphs

时间:2009-06-11 19:46:58

标签: ruby-on-rails activerecord has-many-polymorphs

我正在尝试将单个父级的多个多态关系(has_many_polymorphs plugin)定义为相同的子级。

注意有很多观众 注意有很多编辑 观众可以是用户或群组 编辑者可以是用户或组 权限是包含note_idviewer_idviewer_typeeditor_ideditor_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 < PermissionEditPermission < Permission的STI模型。

任何想法/解决方法/问题指针都表示赞赏。

Rails 2.3.0

2 个答案:

答案 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课程中,之后又开始工作了。 (注意:我替换了我的模型名称。)

我没有太多关注它,但我很好奇是否有办法改变这种行为。我对这个框架相当陌生,让任何敏感的东西(如订单支付协会)被大规模分配,似乎要求自己在脚下射击。如果这解决了你的问题,如果你想出其他任何问题,请告诉我。

最佳,
史蒂夫