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

但它应该能够生成一个 SQL 查询,在其中找到所有带有其 id 的 player_structures,然后根据 structure_id 和 structure_type 获取结构。为什么这会失败,我怎样才能有效地构造一个多态连接表?

更新

如果我手动执行我希望它执行的操作,它会起作用:

player_structures.collect(&:structure)

Rails,你不这样做吗?

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 回答