Ruby on rails 多态性有一个通过接受嵌套的属性而构建的属性没有设置多态性类型

Ruby on rails 多态性有一个通过接受嵌套的属性而构建的属性没有设置多态性类型,ruby-on-rails,ruby-on-rails-4,spree,polymorphic-associations,Ruby On Rails,Ruby On Rails 4,Spree,Polymorphic Associations,注意:虽然项目使用Spree版本2.3,但我目前不认为这是Spree特有的问题。如果我错了,请纠正我 Spree框架有一个名为的模型,如下所示: module Spree class Calculator < Spree::Base belongs_to :calculable, polymorphic: true ... end end 问题是,当我创建ClientProduct时,无论是创建新记录还是更新现有记录,calculators表中的Calculat

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

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

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

    ...
  end
end
问题是,当我创建ClientProduct时,无论是创建新记录还是更新现有记录,calculators表中的Calculatable_type列都保持空。但是,可计算的_id使用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.createclient_product_参数创建的

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


次要旁注:为了简单和简洁起见,关于ClientProduct是如何构建的,我有点撒谎。使用variant_id和client_id的组合,大量插入多个ClientProduct行。但是,calculator_属性对于创建的每个ClientProduct都是相同的,所以我不相信这个特定的设置会改变任何东西。但是,如果有人认为这可能是相关的,请告诉我,我将提供实际但较长的代码。

不确定这是否是原因,但您忽略了关系另一端的多态部分

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

不确定这是否是原因,但您忽略了关系另一侧的多态部分,因为它有一侧

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

我的天哪,这就成功了。所以我认为这里的核心问题是,不清楚as选项是如何工作的。我曾期望Rails能够找出类型,因为它是作为嵌套对象构建的,但显然不是。为什么正确设置ID的答案是,由于命名约定,它表现为一种简单的关系。谢谢你的帮助。我的天哪,这就成功了。所以我认为这里的核心问题是,不清楚as选项是如何工作的。我曾期望Rails能够找出类型,因为它是作为嵌套对象构建的,但显然不是。为什么正确设置ID的答案是,由于命名约定,它表现为一种简单的关系。谢谢你的帮助。
has_one :calculator,
  inverse_of: :calculable,
  foreign_key: :calculable_id,
  dependent: :destroy,
  as: :calculable        #  <== this part