Rails 5:带迭代的数据库设计
Rails 5: Database design with iterations
我目前有一个包含用户、膳食和订单的站点 tables。
- Users table 持有用户信息
- Meals table 包含 Meal 名称、描述、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 %>
- Orders table 包含用户每餐想要的数量
订单迁移参考:
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..
之前我没有使用迭代,而是让相应的 meal1、meal2 等与 HTML 布局中的膳食相匹配。
这显然可以做得更好,但是考虑到我需要能够动态更新膳食信息(我想使用上面的迭代),我应该如何处理这个问题?
而且...如果我使用另一个 table,我如何才能将其实现到迭代中并正确填充?
我可以在 Meals table 中添加一个 'qty' 列并使其成为 belong_to :user,但这显然也是不好的做法,很快就会变得非常混乱。
如果你想存储这样的信息:
Order has meal 1, meal 2 and meal 3 and order belongs to User 1
那你应该对这3个模型有正确的联想。 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
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
我目前有一个包含用户、膳食和订单的站点 tables。
- Users table 持有用户信息
- Meals table 包含 Meal 名称、描述、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 %>
- Orders table 包含用户每餐想要的数量
订单迁移参考:
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..
之前我没有使用迭代,而是让相应的 meal1、meal2 等与 HTML 布局中的膳食相匹配。
这显然可以做得更好,但是考虑到我需要能够动态更新膳食信息(我想使用上面的迭代),我应该如何处理这个问题?
而且...如果我使用另一个 table,我如何才能将其实现到迭代中并正确填充?
我可以在 Meals table 中添加一个 'qty' 列并使其成为 belong_to :user,但这显然也是不好的做法,很快就会变得非常混乱。
如果你想存储这样的信息:
Order has meal 1, meal 2 and meal 3 and order belongs to User 1
那你应该对这3个模型有正确的联想。 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
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