有条件的多态关联有很多通过

时间:2015-11-24 15:11:59

标签: ruby-on-rails activerecord polymorphism rails-activerecord

我在模型之间有一个棘手的关联结构,我无法弄清楚如何实现它。

我有政策,每个政策都有政策参与者。

这些政策参与者可以是个人或公司,也可以是特定类型,例如保险公司或贡献者。每个策略只有一种策略参与者。

到目前为止我所拥有的:

class Policy < ActiveRecord::Base
  has many :policy_participants

  # insuree
  has_one :insuree_participant, -> { insuree }, class_name: 'PolicyParticipant'
  has_one :insuree, through: :policy_participants, -> { where(role: 1) }, source: :participant
end

class PolicyParticipant < ActiveRecord::Base
  belongs_to :policy
  belongs_to :participant, polymorphic: true
  enum role: { insuree: 1, contributor: 2, etc: 3 }
end

class Person < ActiveRecord::Base  # same for Company.rb
  has_many :policy_participations, as: :participant
  has_many :insuree_policy_participations, -> { insuree }, as: :participant
end

在rails控制台中,当我尝试policy.insuree时,我收到此错误:

ActiveRecord :: HasManyThroughSourceAssociationNotFoundError:找不到源关联&#34; insuree&#34;或者:模型PolicyParticipant中的保险公司。尝试&has 39:has_many:insuree,:through =&gt; :policy_participants,:source =&gt; &#39 ;.是政策,参与者,类型,地址,个人或公司吗?

我想到了一个人和公司的父类,但由于只有共同的名称,我宁愿避免这样做。

有人能帮助我吗?

1 个答案:

答案 0 :(得分:0)

我认为这条线需要改变

has_one :insuree, through: :policy_participants, -> { where(role: 1) }, source: :participant

has_one :insuree, -> { where(role: 1) }, through: :policy_participants, source: :participant

lambda(或范围)需要是has_one

的第一个参数