0

has_many_polymorphs plugin単一の親から同じ子への複数のポリモーフィック リレーション ( ) を定義しようとしています。

メモには多くの閲覧者がいます
メモには多くの編集
者がいます 閲覧者はユーザーまたはグループのいずれかです 編集者はユーザーまたはグループの
いずれか
です 許可は、、、、、フィールドとのnote_id関連付けモデルですviewer_idviewer_typeeditor_ideditor_type

Note モデルで has_many_polymorphs リレーションが 1 つしか定義されていない限り、すべてが期待どおりに機能します。

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 ....>

さて、2番目のリレーションを追加すると問題が発生し始めます

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 < PermissionEditPermission < Permission

任意の考え/回避策/問題のポインタをいただければ幸いです。

レール 2.3.0

4

2 に答える 2

0

@テイマー

同じエラーが発生していました。問題は、has_many_polymorphs一括関連付けを使用して結合テーブルにレコードを作成し、失敗していたことでした。私はattr_accessible、、をクラスに追加:note_id:editor_idましたが:editor_typePermissionその後は機能しました。(注:私はあなたのモデル名を私のものに置き換えました。)

あまり詳しく調べていませんが、この動作を変更する方法があるかどうか知りたいと思います。私はこのフレームワークにかなり慣れていないので、機密性の高いもの(注文と支払いの関連付けなど)を大量に割り当てることは、自分自身を足で撃つように求めているようです。これで問題が解決したかどうか、また何か問題が解決したかどうかをお知らせください。

最高、
スティーブ

于 2009-06-27T14:26:20.800 に答える
0

追加する必要はありませんか

has_many :permissions

あなたのメモに。ご参考までに。一度使用has_many_polymorphsしましたが、落としてしまい、期待通りに動作しませんでした。

許可に使用しているスキーマを投稿できますか? 私の推測では、問題の根本はそこにありますbelongs_to。定義に 2 つの異なるものがあるため、スキーマに複数のタイプと ID のペアが必要です。

編集:

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. 
于 2009-06-11T19:59:34.680 に答える