我有3张桌子:
他们设置为:
订单有很多产品到 line_items
这允许我在 line_items 中存储诸如product_id,数量,购买时的价格,折扣等等......
一切都很顺利。
我希望实现的目标:
我现在需要某些产品具有用户可更改的状态。这意味着在处理订单后的某个时间点,购买产品状态可以从一种状态更改为另一种状态。
产品表有一个可状态布尔字段,用于跟踪所述产品是否支持状态。
问题:
我是否只需在line_items中添加状态字段?只有少量的产品需要一个状态,所以感觉就像浪费,但我不确定如何处理这个障碍。我主要担心的是,随着应用程序的增长,特定产品需要额外的可选字段,我最终会得到一张大表。
答案 0 :(得分:0)
有两种选择:
- 在联接模型中创建一列
- 创建单独的"状态"表,可用于创建特定的状态更新
醇>
-
<强>属性强>
我个人会在联接模型中创建一个列以支持status
。是的,它将要求您为每个line_item
添加该列,但它将使该过程更简单,并且在没有大量问题的情况下提供可扩展性
您最好使用其中一个state machine宝石(state_machine
,aasm_state
)来提供:
#app/models/line_item.rb
Class LineItem < ActiveRecord::Base
include AASM
aasm do
state :active, :initial => true
state :inactive
event :activate do
transitions :from => :inactive, :to => :active
end
event :deactivate do
transitions :from => :active, :to => :inactive
end
end
end
这将使您能够直接影响line_item
模型的状态
-
关联模式
或者,您可能想要创建不同的表/模型:
#app/models/line_item_status.rb
Class Status < ActiveRecord::Base
#field id | line_item_id | status | created_at | updated_at
belongs_to :line_item
end
#app/models/line_item.rb
Class LineItem < ActiveRecord::Base
has_one :status
delegate :status, to: :status #-> allows you to call @line_item.status
end
这样您就可以设置每个产品的状态,只需为每个status
line_item
,从而提高数据表的效率