В настоящее время у меня есть сайт с таблицами "Пользователи", "Питание" и "Заказы".
В настоящее время я показываю блюда, используя итерацию:
<% @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, но это тоже явно плохая практика, и она очень быстро станет беспорядочной.
Информация о блюдах глобальна, все пользователи будут видеть одни и те же блюда. Пользователь может изменять количество только для каждого приема пищи (это текущее назначение таблицы заказов).
Если вы хотите сохранить информацию примерно так:
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 to
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
, содержащие информацию об идентификаторе еды и их соответствующих количествах. .
Обновлять: Модели будут выглядеть так:
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
Отношения «многие ко многим» теперь имеют больше смысла. Итак, что касается отображения информации о еде и количества в одной итерации, могу ли я как-то добавить это поле количества и оставить итерацию как есть?
благодаря краткой ссылке на руководство по рельсам и вашей помощи, я теперь полностью понимаю использование: through, которое, как я теперь понимаю, жизненно важно в этих типах отношений. Раньше я даже не думал, что это возможно. Спасибо.
В таблице заказов вы хотите указать только общее количество блюд или информацию о блюдах.