【问题标题】:Polymorphic has_one built through accepts_nested_attributes_for is not setting polymorphic type通过 accept_nested_attributes_for 构建的多态 has_one 未设置多态类型
【发布时间】:2015-04-10 02:55:59
【问题描述】:

注意:虽然该项目使用 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

我的模型,称为ClientProductCalculatorhas_one 关系,并且可以接受它的嵌套属性,就像这样:

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(新记录或更新现有记录)时,calculators 表中的 calculable_type 列仍然为空。 但是calculable_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.create(client_product_params) 创建的。

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

次要旁注:为了简单起见,关于ClientProduct 的构建方式,我有点撒谎。使用组合 variant_ids 和 client_ids 批量插入多个 ClientProduct 行。但是,calculator_attributes 对于创建的每个ClientProduct 都是相同的,所以我不相信这个特定的设置会改变任何东西。但是,如果有人觉得这可能是相关的,请告诉我,我会提供实际(虽然更长)的代码。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 天哪,成功了。所以我认为这里的核心问题是不清楚as 选项是如何工作的。我曾期望 Rails 能够识别类型,因为它是作为嵌套对象构建的,但显然不是。正确设置 ID 的原因是,由于命名约定,它表现为简单的关系。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    相关资源
    最近更新 更多