具有多态关联的未知属性

时间:2019-02-22 18:11:16

标签: ruby-on-rails ruby polymorphism

在我的网上商店中,有表格产品尺寸,我还想添加表格进货

我认为最好是使用进货表来代替更新产品,然后我才能跟踪添加任何新尺寸,数量以及为什么不添加新价格(买卖)的日期。 )...并创建统计信息...

这是正确的吗?

一旦创建了补货,相应的产品会更新为新的数量和价格吗?

好吧

所以它是这样开始的:

#Product 
has_many :sizes
accepts_nested_attributes_for :sizes, reject_if: :all_blank, allow_destroy: true

#Size 
belongs_to :product

进货表需要具有尺寸属性(如产品)

我相信我必须使用多态关联,但是应该如何更新我的架构,应该添加,删除哪些内容?

因此,由于我添加了进货模型,所以我的模型如下所示:

#Product
has_many :sizes, inverse_of: :product,  dependent: :destroy, as: :sizeable
has_many :restockings
accepts_nested_attributes_for :sizes, reject_if: :all_blank, allow_destroy: true

#Restocking
has_many :sizes, as: :sizeable
belongs_to :product
accepts_nested_attributes_for :sizes, reject_if: :all_blank, allow_destroy: true


#Size
belongs_to :product
belongs_to :restocking
belongs_to :sizeable, polymorphic: true, class_name: "Size"

schema.rb

 create_table "sizes", force: :cascade do |t|
    t.string "size_name"
    t.integer "quantity"
    t.bigint "product_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "quantity_stock"
    t.index ["product_id"], name: "index_sizes_on_product_id"
  end


  create_table "restockings", force: :cascade do |t|
    t.bigint "product_id"
    t.bigint "sizeable_id"
    t.decimal "price", precision: 10, scale: 2
    t.decimal "buying_price", precision: 10, scale: 2
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["product_id"], name: "index_restockings_on_product_id"
    t.index ["sizeable_id"], name: "index_restockings_on_sizeable_id"
  end

  create_table "products", force: :cascade do |t|
    t.string "title", limit: 150, null: false
    t.text "description"
    t.bigint "category_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "color"
    t.integer "user_id"
    t.json "attachments"
    t.string "brand"
    t.string "ref"
    t.decimal "price"
    t.decimal "buying_price", precision: 10, scale: 2
    t.index ["category_id"], name: "index_products_on_category_id"
  end

目前,我有几个错误,例如

在ProductsController中

    def new
      @product = Product.new
      @product.sizes.build
    end

错误:

ActiveModel::UnknownAttributeError at /admin/products/new
unknown attribute 'sizeable_id' for Size.

您能告诉我我必须更改的迁移吗? 欢迎提出建议

1 个答案:

答案 0 :(得分:4)

您快到了,要在Size模型中使用多态,您必须更改 size资源,并向资源添加两个属性:sizeable_idsizeable_type

sizeable_type是一个字符串,表示父元素的类,在您的情况下可以是ProductRestocking,而sizeable_id表示{{1 }}要找到父元素,您的关系是正确的,但是必须将此元素添加到element_id中,请参见以下内容:

迁移到您的案例的一个例子:

Size

在您的class AddSizeableToSize < ActiveRecord::Migration def change add_reference :sizes, :sizeable, polymorphic: true, index: true end end 模型上:

Size

在您的# app/models/size.rb class Size < ActiveRecord::Base belongs_to :sizeable, polymorphic: true end Product模型中:

Restocking

这只是使案件生效的一种简单方法!如果您想了解有关Rails关联和多态的更多信息,请查看此link