Nano Hash - криптовалюты, майнинг, программирование

Обработка заказов в Rails — как лучше всего это смоделировать и создать ассоциации?

У меня возникли проблемы с моделированием простой системы заказов, в которой клиент может создать заказ, выбрав товары.

Мне нужны были следующие модели: Customer, Order, OrderLine и Item. Клиент создает Заказ, который содержит множество строк Заказа, причем каждая Строка Заказа содержит один Товар с количеством, продажной ценой и т. д. Товары — это «продукты», из которых покупатель может выбирать. После того, как товар выбран и назначено желаемое количество, создается OrderLine.

Учитывая это, как лучше настроить ассоциации?

Вот модели в их текущем состоянии:

class Customer < ActiveRecord::Base
   has_many :orders
end

class Item < ActiveRecord::Base
   has_many :order_lines
   has_many :orders, through: :order_lines
end

class OrderLine < ActiveRecord::Base
  belongs_to :order
  belongs_to :item
end

class Order < ActiveRecord::Base
  has_many :order_lines
  has_many :items, through: :order_lines
end

Возможно, Order также должен содержать «belongs_to:customer»?

Вот соответствующие части файла схемы для справки:

create_table "customers", force: :cascade do |t|
  t.string   "fname"
  t.string   "middle_initial"
  t.string   "lname"
  t.string   "street_add"
  t.string   "city"
  t.string   "state"
  t.string   "zipcode"
  t.string   "email"
  t.string   "home_phone"
  t.string   "cell_phone"
  t.string   "phone_pref"
  t.string   "password"
  t.datetime "created_at",     null: false
  t.datetime "updated_at",     null: false
end

create_table "items", force: :cascade do |t|
  t.integer  "barcode"
  t.text     "description"
  t.decimal  "selling_price",   precision: 5, scale: 2
  t.string   "unit_of_measure"
  t.integer  "qty_on_hand"
  t.integer  "location_aisle"
  t.string   "location_area"
  t.datetime "created_at",                              null: false
  t.datetime "updated_at",                              null: false
end

create_table "order_lines", force: :cascade do |t|
  t.integer  "qty_ordered"
  t.decimal  "unit_price",        precision: 5, scale: 2
  t.decimal  "total_price",       precision: 7, scale: 2
  t.integer  "order_id"
  t.integer  "item_id"
  t.datetime "created_at",                                null: false
  t.datetime "updated_at",                                null: false
end

add_index "order_lines", ["item_id"], name: "index_order_lines_on_item_id"
add_index "order_lines", ["order_id"], name: "index_order_lines_on_order_id"

create_table "orders", force: :cascade do |t|
  t.string   "billing_street_add"
  t.string   "billing_city"
  t.string   "billing_state"
  t.string   "billing_zipcode"
  t.string   "shipping_street_address"
  t.string   "shipping_city"
  t.string   "shipping_state"
  t.string   "shipping_zipcode"
  t.string   "cc_fname"
  t.string   "cc_middle_initial"
  t.string   "cc_lname"
  t.string   "cc_number"
  t.string   "cc_security_code"
  t.string   "cc_exp_month"
  t.string   "cc_exp_year"
  t.decimal  "subtotal",                precision: 7,  scale: 2
  t.integer  "tax_percent"
  t.decimal  "shipping_fee",            precision: 5,  scale: 2
  t.decimal  "total",                   precision: 20, scale: 2
  t.integer  "customer_id"
  t.integer  "order_line_id"
  t.datetime "created_at",                                       null: false
  t.datetime "updated_at",                                       null: false
end

add_index "orders", ["customer_id"], name: "index_orders_on_customer_id"
add_index "orders", ["order_line_id"], name: "index_orders_on_order_line_id"

Ответы:


1

Я не вижу никаких проблем с вашей текущей схемой.

Возможно, Order также должен содержать «belongs_to:customer»?

Да, это может пригодиться. Вы можете просто добавить его, когда почувствуете, что вам это нужно.

редактировать:

    t.decimal  "unit_price",        precision: 5, scale: 2
    t.decimal  "total_price",       precision: 7, scale: 2

Зачем нужно сохранять цены в OrderLines? У вас уже есть цены на товары в вашей модели товаров.

15.11.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..