8

我在设置 Rails has_many :through :polymorphic 关系时遇到了一些问题。

我知道这个主题在 SO 上有很好的 记录,但我认为我的问题在于我的模型和 foreign_key 名称而不是语法,即我认为这是一个“我一直在看代码太久”的问题,只需要另一个组的眼睛。

无论如何,我有以下设置:

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