是否可以在模型上存储属性,但只能通过关联访问?

时间:2017-05-22 20:38:07

标签: ruby-on-rails ruby

我正在建立一个电子商务平台,正在研究数据库设计。

这些是我的电子商务网站中的模型:

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}}并且对每个用户都是唯一的)?如果没有,我怎么能设计我的模型/数据库以包含一个订单模型,该模型包含每个订单(电话类型和销售数量)的信息,这些信息对每个用户来说都是独一无二的?

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

更灵活的原因