注意:虽然该项目使用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
我的模型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
问题是当我创建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
都是相同的,因此我不认为此特定设置会更改任何内容。但是,如果有人认为这可能是相关的,请告诉我,我将提供实际(但更长)的代码。
答案 0 :(得分:5)
不确定这是否是原因,但你忽略了关系另一面的多态部分(有一面)
has_one :calculator,
inverse_of: :calculable,
foreign_key: :calculable_id,
dependent: :destroy,
as: :calculable # <== this part