通过accepts_nested_attributes_for构建的多态has_one不设置多态类型

时间:2015-04-09 17:49:49

标签: ruby-on-rails ruby-on-rails-4 spree polymorphic-associations

注意:虽然该项目使用Spree版本2.3,但我目前不相信它是特定于Spree的问题。如果我错了,请纠正我。

Spree框架有一个名为Calculator的模型,如下所示:

module Spree
  class Calculator < Spree::Base
    belongs_to :calculable, polymorphic: true

    ...
  end
end

我从这个类继承创建我自己的计算器,看起来像(与其他任何Spree Calculator subclass略有不同):

module Spree
  class Calculator
    class PercentDiscountOnVariant < Calculator
      preference :percent, :decimal, default: 0

      ...
    end
  end
end

我的模型ClientProducthas_oneCalculator关系,可以接受它的嵌套属性,就像这样:

module Spree
  class ClientProduct < ActiveRecord::Base
    has_one :calculator, inverse_of: :calculable, foreign_key: "calculable_id", dependent: :destroy

    accepts_nested_attributes_for :calculator

    ...
   end
end

问题是当我创建ClientProduct(新记录或更新现有记录)时,calculable_type表中的calculators列保持为空。 calculable_id IS已使用ClientProduct的ID正确填充。

参数图的相关部分是:

"client_product"=>{
    "variant_id"=>"300", 
    "client_id"=>"2", 
    "role_ids"=>["7"]
    "calculator_attributes"=> {
        "type"=>"Spree::Calculator::PercentDiscountOnVariant",
        "preferred_percent"=>"15"
    }
}

使用ClientProduct创建Spree::ClientProduct.create(client_product_params)

什么会导致多态ID正确设置,同时将多态类型列保留为null?

次要的旁注:为了简单和简洁起见,我有点说谎ClientProduct是如何构建的。使用组合variant_ids和client_ids批量插入多个ClientProduct行。但是,calculator_attributes对于创建的每个ClientProduct都是相同的,因此我不认为此特定设置会更改任何内容。但是,如果有人认为这可能是相关的,请告诉我,我将提供实际(但更长)的代码。

1 个答案:

答案 0 :(得分:5)

不确定这是否是原因,但你忽略了关系另一面的多态部分(有一面)

has_one :calculator,
  inverse_of: :calculable,
  foreign_key: :calculable_id,
  dependent: :destroy,
  as: :calculable        #  <== this part