Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 可选字段的数据库设计_Ruby On Rails_Postgresql_Database Design - Fatal编程技术网

Ruby on rails 可选字段的数据库设计

Ruby on rails 可选字段的数据库设计,ruby-on-rails,postgresql,database-design,Ruby On Rails,Postgresql,Database Design,我有三张桌子: 命令 行项目 产品 它们被设置为: 订单中有许多产品是通过第_行项目订购的 这使我能够在线存储商品,如产品id、数量、购买时的价格、折扣等 到目前为止一切顺利 我希望实现的目标是: 我现在需要一些具有用户可更改状态的产品。这意味着在订单处理后的某个时间点,购买的产品状态可以从一种状态更改为另一种状态 product表有一个statusable布尔字段,用于跟踪所述产品是否支持状态 问题是: 我是否可以在第_行项目中添加一个状态字段?只有一小部分产品需要一个状态,所以感觉像是浪费,

我有三张桌子:

命令 行项目 产品 它们被设置为:

订单中有许多产品是通过第_行项目订购的

这使我能够在线存储商品,如产品id、数量、购买时的价格、折扣等

到目前为止一切顺利

我希望实现的目标是:

我现在需要一些具有用户可更改状态的产品。这意味着在订单处理后的某个时间点,购买的产品状态可以从一种状态更改为另一种状态

product表有一个statusable布尔字段,用于跟踪所述产品是否支持状态

问题是:


我是否可以在第_行项目中添加一个状态字段?只有一小部分产品需要一个状态,所以感觉像是浪费,但我不知道还有什么其他方法可以克服这个障碍。我主要担心的是,随着应用程序的增长,以及特定产品需要额外的可选字段,我最终会得到一个庞大的表。

有两种选择:

在联接模型中创建列 创建一个单独的状态表,可用于创建特定的状态更新 -

属性

我个人会在join模型中创建一个列来支持状态。是的,它将要求您为每一行_项都设置该列,但这将使过程更加简单,并提供可扩展性,而不会出现大量问题

您最好使用其中一种宝石,以提供:

#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

这将使您能够设置每个产品的状态,通过仅为每个行项目包含一个状态,使数据表更加高效

您的订单和行项目记录在仅附加表中应是不可变的,订单的产品副本也应是不可变的。因此,如果您必须在事后更改某些内容,我会将其放在单独的表(如product_status)中,您可以在订单创建时为具有状态的产品插入状态行。使该表可更新,以便以后可以更新状态,并且仅更新状态。用户不可能在事后编辑订单的任何其他部分-他们应该添加修改。理由:订单是发生的事情的记录,而不是实时状态。所以它应该是不变的。错误应该通过日志修正来纠正。谢谢@CraigRinger的解释,你介意回答这个推论吗。如果订单有一个状态,即shipped,那么它不应该是orders表中的一个字段吗?@Vasseurth嗯,您可以使用数据库列级别的权限对所有订单列授予INSERT,但我猜只能对state列授予UPDATE。就我个人而言,我会使用边桌,这样我就可以只保留订单,但这是一种设计偏好。无论哪种方式,你都应该确保没有其他栏目可以更改。完全同意@CraigRinger。为了清楚起见,您建议为每个购买后可配置产品选项创建一个简单的表,并以编程方式将行_item.id分配给该选项?谢谢@RichPeck,您将如何处理添加其他购买后可变属性的问题?例如,某些产品的状态是您的解决方案解决的,但展望未来,因为其他产品需要不同的属性,例如某些产品可能是可赎回的等等。。。感觉应该有更好的管理方法,而不是为每个新的可变产品属性创建关联模型。希望这是有道理的。
#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