在Rails中创建具有关联表的记录

时间:2018-09-23 21:41:39

标签: ruby-on-rails sqlite

我不熟悉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

感谢您可以给新朋友的帮助!

1 个答案:

答案 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中,除非您的逻辑要求如此。