Rails 5: проектирование базы данных с итерациями - PullRequest
0 голосов
/ 27 октября 2018

В настоящее время у меня есть сайт с таблицами Users, Meals и Orders.

  • Таблица пользователей содержит информацию о пользователе
  • Таблица блюд содержит название еды, описание, 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..

До того, как я не использовал итерацию, у меня была соответствующая еда1, еда2 и т. Д., Соответствующая еде в HTML-макете.

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

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

Я мог бы добавить столбец «qty» в таблицу «Питание» и сделать его принадлежащим пользователю, но это, очевидно, тоже плохая практика, и он очень быстро запутается.

1 Ответ

0 голосов
/ 27 октября 2018

Если вы хотите хранить информацию что-то вроде:

В заказе есть еда 1, еда 2 и еда 3, и заказ принадлежит пользователю 1

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

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

И Order будет belong to a User

Решение:

Измените 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, содержащие информацию о еде ID и их соответствующие количества.

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

Order.rb

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

Quantity.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
...