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_type列calculators仍为空。但是,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,同时又使多态类型列为空?
小注释:为了简洁起见,我在某种程度上撒谎了ClientProduct。ClientProduct使用variant_ids和client_ids的组合来批量插入多行。但是,calculator_attributes对于ClientProduct创建的每个对象,它们都是相同的,因此,我认为此特定设置不会更改任何内容。但是,如果有人觉得这可能是相关的,请告诉我,我将提供实际的(尽管更长)代码。
不知道这是否是原因,但您在关系的另一侧(的一侧)遗漏了多态部分
has_one :calculator,
inverse_of: :calculable,
foreign_key: :calculable_id,
dependent: :destroy,
as: :calculable # <== this part
Run Code Online (Sandbox Code Playgroud)