我正在建立一个电子商务平台,正在研究数据库设计。
这些是我的电子商务网站中的模型:
class User < ApplicationRecord
belongs_to :cart, {:optional => true}
end
class Cart < ApplicationRecord
has_and_belongs_to_many :phones
has_one :user
end
class Phone < ApplicationRecord
has_and_belongs_to_many :carts # has join table with Cart
has_and_belongs_to_many :orders
end
class Order < ApplicationRecord
belongs_to :user, {:optional => true}
has_and_belongs_to_many :phones #HAS join table with Phone
end
我的网站向用户(Model Phone
)销售电话(Model User
),用户将其放入购物车(Model Cart
),订单一旦提交,就会创建订单( Model Order
)。
我想在提交并最终确定购买后,通过将@user.cart.phones
(@user
=当前用户)放入订单模型来更新销售数量。我遇到的麻烦就是我应该如何设计数据库架构,这样我就可以跟踪所售电话的类型,以及订单中售出的特定电话的数量。
我正在思考@user.order.phones
的某些内容,并在Phone
模型上有一个名为quantity的属性。问题在于所有用户都可以访问Phone模型,因此,当其他用户提交订单时,它会被覆盖。
我的问题是,是否可以在手机型号上设置属性,只有@user.cart
可以访问(即:@user.cart.phones.phones_sold
- &gt; .phones_sold
只能通过{ {1}}并且对每个用户都是唯一的)?如果没有,我怎么能设计我的模型/数据库以包含一个订单模型,该模型包含每个订单(电话类型和销售数量)的信息,这些信息对每个用户来说都是独一无二的?
答案 0 :(得分:4)
你有
class Cart < ApplicationRecord
has_and_belongs_to_many :phones
end
class Phone < ApplicationRecord
has_and_belongs_to_many :carts # has join table with Cart
end
这是一个好的开始,但问题是您的应用程序无法直接访问连接表。
改为......
class Cart < ApplicationRecord
has_many :cart_phone_links
has_many :phones, through: :cart_phone_links
end
class Phone < ApplicationRecord
has_many :cart_phone_links
has_many :carts, through: :cart_phone_links
end
class CartPhoneLink < ApplicationRecord
belongs_to :cart
belongs_to :phone
end
这为您提供了与has_and_belongs_to_many
相同的功能,但由于新表实际上是一个可由rails访问的表,您可以添加其他字段以提供有关该关系的更多信息,例如quantity
< / p>
这通常是has_many ... through:
被认为比has_and_belongs_to_many