8

Rails has_many:through:polymorphic関係の設定に少し問題があります。

私はこの主題がSOで十分に 文書化されていることを知っていますが、私の問題は構文ではなくモデルと外部キー名にあると思います。つまり、これは「コードを長く見すぎている」問題であり、別の問題が必要だと思います。目のセット。

とにかく私は次の設定をしています:

class Milestone < ActiveRecord::Base
  has_many :responsible_items, :as => :responsibility
  has_many :responsible, :through => :responsible_items
end

class ResponsibleItem < ActiveRecord::Base
  belongs_to :responsible, :class_name => "User"
  belongs_to :responsibility, :polymorphic => true
end

class User < ActiveRecord::Base
  has_many :responsible_items, :foreign_key => :responsible_id
  has_many :responsibilities, :through => :responsible_items
end

これは、マイルストーン側から見ると、エラーなしで正常に機能しているようです。たとえば、ターミナルで私は書くことができます:

Milestone.first.responsible

…そして、私が期待するように空のコレクションを取得します。

ただし、ユーザー側から見ると、次のように実行されます。

User.first.responsibilities

…ARエラーを返しています:

ActiveRecord::HasManyThroughAssociationPolymorphicSourceError: Cannot have a has_many :through association 'User#responsibilities' on the polymorphic object 'Responsibility#responsibility'.

この問題は、ユーザー関係を:responsibleと呼んでいるという事実と関係があると思います。これは正しいですか?

どんな助けでも大歓迎です、ありがとう。

4

1 に答える 1

12

@Abidのコメントのおかげで、私はresponsibilitiesユーザーのためにすべてを引き込むロジスティクスについて考えましたが、それは実現可能ではありませんでした。私は関係から何を望んでいるかについてより具体的にする必要があり、その結果、以下を定義することができました:

class User < ActiveRecord::Base
  has_many :responsible_items, :foreign_key => :responsible_id
  has_many :milestone_responsibilities, :through => :responsible_items, :source => :responsibility, :source_type => 'Milestone'
end

次に、他のモデルにさらにポリモーフィックな関係を追加するときに、これを拡張できます。たとえば、次のようになります。

class User < ActiveRecord::Base
  has_many :responsible_items, :foreign_key => :responsible_id
  has_many :milestone_responsibilities, :through => :responsible_items, :source => :responsibility, :source_type => 'Milestone'
  has_many :task_responsibilities, :through => :responsible_items, :source => :responsibility, :source_type => 'Task'
end
于 2012-04-20T16:21:57.503 に答える