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

Pau*_*ter 1 ruby-on-rails polymorphic-associations spree ruby-on-rails-4

注意:虽然该项目使用的是Spree 2.3版,但我目前不认为这是Spree特有的问题。如果我错了,请纠正我。

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

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

    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

我从此类继承而来,创建了自己的计算器,看起来就像(与其他Spree Calculator子类几乎没有什么不同):

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

      ...
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我的模型,叫做ClientProduct有一个has_one与关系Calculator,并能接受它的嵌套属性,只需像这样:

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
Run Code Online (Sandbox Code Playgroud)

问题在于,当我创建ClientProduct(新记录或更新现有记录)时,表中的calculable_typecalculators仍为空。但是calculable_idIS正确填充了ClientProductID。

参数图的相关部分是:

"client_product"=>{
    "variant_id"=>"300", 
    "client_id"=>"2", 
    "role_ids"=>["7"]
    "calculator_attributes"=> {
        "type"=>"Spree::Calculator::PercentDiscountOnVariant",
        "preferred_percent"=>"15"
    }
}
Run Code Online (Sandbox Code Playgroud)

并且使用ClientProduct创建简单Spree::ClientProduct.create(client_product_params)

是什么会导致正确设置多态ID,同时又使多态类型列为空?

小注释:为了简洁起见,我在某种程度上撒谎了ClientProductClientProduct使用variant_ids和client_ids的组合来批量插入多行。但是,calculator_attributes对于ClientProduct创建的每个对象,它们都是相同的,因此,我认为此特定设置不会更改任何内容。但是,如果有人觉得这可能是相关的,请告诉我,我将提供实际的(尽管更长)代码。

Moh*_*ady 5

不知道这是否是原因,但您在关系的另一侧(的一侧)遗漏了多态部分

has_one :calculator,
  inverse_of: :calculable,
  foreign_key: :calculable_id,
  dependent: :destroy,
  as: :calculable        #  <== this part
Run Code Online (Sandbox Code Playgroud)