Rails 5: проектирование базы данных с итерациями

В настоящее время у меня есть сайт с таблицами "Пользователи", "Питание" и "Заказы".

  • Таблица Users содержит информацию о пользователе
  • Таблица Meals содержит название еды, описание, img (url)

В настоящее время я показываю блюда, используя итерацию:

<% @meals.each do |meal| %>
 <%= image_tag(meal.img,  alt: meal.name) %>
 <span class = "mealname"><%= meal.name %></span>
 <p><%= meal.description %><p>

   <div class = "qty">
       INPUT FOR ORDER QTYS HERE
   </div>

<% end %>
  • Таблица заказов содержит количество, которое пользователь хочет для каждого приема пищи.

Перенос заказов для справки:

  t.belongs_to :user
  t.integer :total_meals, null: false, default:"0"
  t.integer :meal1, null: false, default: "0"
  t.integer :meal2, null: false, default: "0"
  etc..

Раньше я не использовал итерацию и имел соответствующие food1, food2 и т. д., Соответствующие Meals в макете HTML.

Очевидно, что это можно сделать лучше, однако, учитывая, что мне нужна возможность динамического обновления информации о еде (я хочу использовать итерацию выше), как мне поступить с этим?

Но также ... если я использую другую таблицу, как я смогу реализовать это в итерации и правильно заполнить?

Я мог бы добавить столбец «qty» в таблицу Meals и сделать его own_to: user, но это тоже явно плохая практика, и она очень быстро станет беспорядочной.

В таблице заказов вы хотите указать только общее количество блюд или информацию о блюдах.

Saqib Shahzad 27.10.2018 00:28

Информация о блюдах глобальна, все пользователи будут видеть одни и те же блюда. Пользователь может изменять количество только для каждого приема пищи (это текущее назначение таблицы заказов).

sgt_disco 27.10.2018 00:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите сохранить информацию примерно так:

Order has meal 1, meal 2 and meal 3 and order belongs to User 1

Тогда у вас должны сложиться правильные ассоциации между этими тремя моделями. User, Meal и Order

Один Order может принимать несколько приемов пищи, а один Meal может принадлежать многим заказам, поэтому Order и Meal будут иметь many-to-many association.

И Order будет belong toUser

Решение:

Измените свою модель Order на:

t.belongs_to :user

Добавьте четвертую модель, назовите ее Quantity:

t.belongs_to :order
t.belongs_to :meal
t.integer :quantity

Теперь предположим, что пользователь A выбирает 2 единицы еды A, 3 единицы еды B, вы создадите заказ A для этого пользователя, и заказ A будет иметь две записи в модели Quantity, содержащие информацию об идентификаторе еды и их соответствующих количествах. .

Обновлять: Модели будут выглядеть так:

Order.rb

belongs_to :user
has_many :quantities
has_many :meals, through: :quantities

Количество.rb

belongs_to :order
belongs_to :meal

Meal.rb

has_many :quantities
has_many :orders, through: :quantities

User.rb

has_many :orders

Затем, если вы хотите узнать общее количество заказов на одно блюдо, вы можете получить его:

meal.orders.count

и если вы хотите получить все блюда, которые есть в одном заказе, и их количество:

order.quantities.each do |record|
  record.meal.name # for name of associated meal
  record.quantity # for quantity of meal
end

Отношения «многие ко многим» теперь имеют больше смысла. Итак, что касается отображения информации о еде и количества в одной итерации, могу ли я как-то добавить это поле количества и оставить итерацию как есть?

sgt_disco 27.10.2018 01:06

благодаря краткой ссылке на руководство по рельсам и вашей помощи, я теперь полностью понимаю использование: through, которое, как я теперь понимаю, жизненно важно в этих типах отношений. Раньше я даже не думал, что это возможно. Спасибо.

sgt_disco 27.10.2018 01:34

Другие вопросы по теме