我不熟悉ruby,也不了解如何使用关联表创建和保存记录。我希望控制器获取数据以创建产品记录,然后创建与该产品关联的尽可能多的属性和产品属性。财产和产品财产具有一对一的关系。该产品可以具有许多特性和产品特性。
属性和产品属性如下所示:
{"name"=>"color", "value"=>"red"}
{"name"=>"material", "value"=>"cotton"}
我的控制器可用于创建产品,但是我不确定如何创建一个循环,该循环将与从客户端发送的数组中关联的产品和产品属性一起构建。
现在我的控制器:
class SendDataController < ApplicationController
protect_from_forgery with: :null_session
def hi
product = Product.new
product.name = params[:name]
product.upc = params[:upc].to_i
product.available_on = params[:availableon]
product.save
end
end
下面是我的模型:
class Product < ApplicationRecord
has_many :propertys, dependent: :destroy
has_many :product_propertys, dependent: :destroy
end
class Property < ApplicationRecord
belongs_to :product
has_one :product_property, dependent: :destroy
end
class ProductProperty < ApplicationRecord
belongs_to :property
belongs_to :product
end
迁移:
class CreateProducts < ActiveRecord::Migration[5.2]
def change
create_table :products do |t|
t.string :name
t.string :upc
t.datetime :available_on
t.timestamps
end
end
end
class CreateProductProperties < ActiveRecord::Migration[5.2]
def change
create_table :product_properties do |t|
t.string :value
t.belongs_to :property
t.belongs_to :product
t.timestamps
end
end
end
class CreateProperties < ActiveRecord::Migration[5.2]
def change
create_table :properties do |t|
t.string :name
t.belongs_to :product
t.timestamps
end
end
end
模式:
ActiveRecord::Schema.define(version: 2018_09_22_140824) do
create_table "product_properties", force: :cascade do |t|
t.string "value"
t.integer "property_id"
t.integer "product_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["product_id"], name: "index_product_properties_on_product_id"
t.index ["property_id"], name: "index_product_properties_on_property_id"
end
create_table "products", force: :cascade do |t|
t.string "name"
t.string "upc"
t.datetime "available_on"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "properties", force: :cascade do |t|
t.string "name"
t.integer "product_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["product_id"], name: "index_properties_on_product_id"
end
end
感谢您可以给新朋友的帮助!
答案 0 :(得分:1)
您需要的产品型号多个,具有 has_many 个属性,同样具有has_many个product_properties。
您的属性架构将需要product_id作为整数。我会避免使用 has_one ,它会变得凌乱,只需使用has_many,否则您可能需要 has_many through
您的 ProductProperty模型,您还需要product_id整数和property_id整数,将它们添加为单独的迁移。
将db:Rails db:create add_product_id_to product_properties,product_id:integer 检查迁移文件 product_id 该属性是否在文件中 rails db:migrate 重新启动服务器并在控制台中进行测试。
一旦模型讲完,实例化一个Product对象,通过设置并依次使 SendDataController 作废,将其通过相应的控制器带入Properties和ProductProperty中,除非您的逻辑要求如此。