Создание объекта JSON для отправки обратно клиенту - PullRequest
0 голосов
/ 25 сентября 2018

Спасибо всем, кто помог мне так далеко.У меня только один последний вопрос, и я думаю, что смогу отменить этот учебный проект.

Я хочу создать объект JSON. Вот так:

 [
     {name: 'xbox',
      upc: '1313413412',
      available_on: '12/31/18',
      properties: [
       {name: 'material',
        value: 'plastic'
       },
       {name: 'color',
        value: 'white'
       },
      ]
     },
     {name: 'nintendo',
      upc: '1313413412',
      available_on: '12/31/18',
      properties: [
       {name: 'material',
        value: 'plastic'
       },
       {name: 'color',
        value: 'black'
       },
      ]
     }
]

У меня есть 3 таблицы product, properties, product_properties

Я присоединяюсь к ним, выполняя это мой контроллер:

@products = Product.joins(:properties, :product_properties)

 @products.each do |product| 

 end

Но я не знаю, куда идти отсюда.Я прошу прощения за новый вопрос.Я просто пытаюсь учиться на практике.Мои ассоциации настроены правильно.

Схема:

ActiveRecord::Schema.define(version: 2018_09_24_163027) do

  create_table "product_properties", force: :cascade do |t|
    t.string "value"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "product_id"
    t.integer "property_id"
    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.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "product_id"
    t.index ["product_id"], name: "index_properties_on_product_id"
  end

end

Еще раз спасибо за любую помощь, которую вы можете мне оказать.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Во-первых, вам нужно определить модели и установить отношения между ними.Используя таблицы из вашего примера, классы моделей будут иметь вид:

class Product < ApplicationRecord
  has_many :product_properties
  has_many :properties, through: :product_properties
end

class Property < ApplicationRecord
  has_many :product_properties
  has_many :products, through: :product_properties
end

class ProductProperty < ApplicationRecord
  belongs_to :product
  belongs_to :property
end

(подробнее см .: https://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many)

Затем в методе вашего контроллера

products = Product.joins(:properties, :product_properties).map do |product|
  {
    name: product.name,
    upc: product.upc,
    available_on: product.available_on.strftime("%m/%d/%Y"),
    properties: product.product_properties.map do |pr_property|
      {
        name: pr_property.property.name,
        value: pr_property.value
      }
    end
  }
end

render json: products

Существует пустое пространство для оптимизации запросов, однако, я думаю, что это хорошо для проекта с минимальными затратами.

0 голосов
/ 25 сентября 2018
@products.map do |product|
  {
    name: product.name,
    properties: product.product_properties.map do |product_property|
      {
        name: product_property.property.name,
        value: product_property.value
      }
    end
  }
end.to_json

Не стесняйтесь ставить любые атрибуты, которые вам нужны.Вы упомянули, что вам нужен JSON, но вы на самом деле вставили хэш Ruby, в конце я добавил .to_json.

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