如何构建避免rails中的ActiveRecord :: HasManyThroughCantAssociateThroughOasOneOrManyReflection错误的对象?

时间:2015-11-26 03:52:21

标签: ruby-on-rails activerecord

尝试在rails应用中构建新对象时遇到ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection错误。它不符合我所见过的任何标准错误,也无法通过inverse_of关联修复。

我认为我需要运行一个回调来帮助完成这项工作 - 任何人都可以帮助解决以下问题:

def PhoneNumber do
 belongs_to :key_contact
end

def KeyContact do
 has_many :phone_numbers
 has_many :sale_contacts
end

def SaleContact do
 belongs_to :key_contact
 belongs_to :sales_opportunity
 has_many :phone_numbers, through: :key_contact
 accepts_nested_attributes_for :phone_numbers
end

正如您所看到的,SaleContact是key_contacts和sales_opportunities相遇的联接表 - 基本上我选择现有的key_contacts并在sales_opportunity页面上显示它们,其中包含一些额外的详细信息(角色,偏好等等) - 我' ve为简洁起见,将其排除在外。)

添加新的sale_contact时,我希望为用户提供同时添加phone_numbers的功能。这会引发我的activerecord错误。

我的SaleContact控制器:

def new
 @sale_contact = SaleContact.new
 @phone_number = @sale_contact.phone_numbers.build
end

这可以在输入表单上显示fields_for phone_number,并通过params哈希传递正确的属性以添加新的phone_number,但是当我收到错误时就是这样:

ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection (Cannot modify association 'SaleContact#phone_numbers' because the source reflection class 'PhoneNumber' is associated to 'KeyContact' via :has_many.):

从我所看到的:

  1. 我的新控制器操作会构建一个phone_number,但因为sale_contact还不知道它与哪个key_contact相关联,我认为ActiveRecord会混淆
  2. 如果我尝试删除@ sale_contact.phone_number.build行(例如将其替换为PhoneNumber.new),则SaleContact新表单上不再显示这些字段
  3. 因此我想创建一个回调来从sale_contact哈希中去掉phone_number_attributes,销毁新构建的phone_number和所有关联,然后通过将phone_numbers_attributes传递给PhoneNumber.new(phone_number_attributes)动作并保存为单独的交易。那会有用吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试这样做:

delegate :phone_numbers, to: :key_contact