9

多くの構造を持つプレーヤーと、そのプレーヤーに属する構造が必要です。構造は多態的な関係です。

class Player < ActiveRecord::Base
  has_many :player_structures
  has_many :structures, :through => player_structures
end

class PlayerStructures < ActiveRecord::Base
  belongs_to :structure, polymorphic: true
  belongs_to :player
end

class StructureA < ActiveRecord::Base
  has_one :player_structure, :as => :structure
  has_one :player, :through => :player_structure
end

class StructureB < ActiveRecord::Base
  has_one :player_structure, :as => :structure
  has_one :player, :through => :player_structure
end

しかし、私が引き出してPlayer.firstその構造を求めると、次のようになります。

ActiveRecord::HasManyThroughAssociationPolymorphicSourceError: Cannot have a has_many :through association 'Player#structures' on the polymorphic object 'Structure#structure'.

ただし、IDを持つすべてのplayer_structuresを検索し、structure_idとstructure_typeに基づいて構造をフェッチするSQLクエリを生成できる必要があります。これが失敗するのはなぜですか。また、ポリモーフィック結合テーブルを有効に作成するにはどうすればよいですか。

アップデート

手動で実行したいことを実行すると、次のように機能します。

player_structures.collect(&:structure)

レール、そうじゃないの?

4

1 に答える 1

13

モデルでの関係をより具体的に定義する必要があると思いますPlayer。例えば:

class Player < ActiveRecord::Base
  has_many :player_structures
  has_many :structureas, :through => player_structures, :source => :structure, :source_type => 'StructureA'
  has_many :structurebs, :through => player_structures, :source => :structure, :source_type => 'StructureB'
end

次に、それぞれに個別にアクセスする代わりに、リレーションシップで定義されたすべての構造を返すメソッドを作成できます。

于 2012-12-15T21:02:51.607 に答える