Создание записей со связанными таблицами в Rails - PullRequest
0 голосов
/ 24 сентября 2018

Я новичок в ruby ​​on rails и не понимаю, как создавать и сохранять записи, используя связанные таблицы.Я хочу, чтобы контроллер взял данные, создал запись продукта, а затем создал столько свойств и свойств продукта, которые связаны с этим продуктом.Свойство и свойство продукта имеют отношение один к одному.Продукт может иметь много свойств и свойств продукта.

Свойства и свойства продукта появляются следующим образом:

{"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 голосов
/ 24 сентября 2018

Ваша Модель продукта требуется множество, has_many properties и равно has_many product_properties.

Ваша Свойство схема будет нуждаться в product_id как целое число.я бы не стал использовать has_one , это может привести к путанице, просто используйте has_many, или вам может потребоваться has_many через

Ваша модель ProductProperty Вам также потребуется целое число product_id и целое число property_id, добавляющие их как отдельную миграцию.

rails db: create add_product_id_to product_properties, product_id: integer проверьте файл миграции product_id что атрибут находится в файле rails db: migrate Перезапустите сервер и протестируйте в консоли.

Как только произнесут Модели, создайте экземпляр объекта Product, перенесите его в Properties & ProductPropertiesчерез соответствующие контроллеры, установив и в свою очередь сделав SendDataController устаревшим, если ваша логика не требует этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...