Ruby on rails 对作为一个组的记录集合进行建模

Ruby on rails 对作为一个组的记录集合进行建模,ruby-on-rails,ruby,ruby-on-rails-4,domain-data-modelling,Ruby On Rails,Ruby,Ruby On Rails 4,Domain Data Modelling,我正在寻找Ruby-Like(Rails 4/5)中具体或抽象方法的方向,以模拟以下需求或用户故事: 给定一个模型,我们用以下属性将其称为PurchaseOrder: 产量 从库存中提取的金额 安置日期 交货日期 产品标识 客户识别码 作为一名用户,我希望能够查看这些采购订单的表列表,并在必要时对它们进行分组 详细信息:当对PurchaseOrder的集合进行分组时,该分组集合的行为应与PurchaseOrder完全相同,因为它必须在表中显示为记录,筛选操作应在分组的记录上工作,就像在单个P

我正在寻找Ruby-Like(Rails 4/5)中具体或抽象方法的方向,以模拟以下需求或用户故事:

给定一个模型,我们用以下属性将其称为PurchaseOrder

  • 产量
  • 从库存中提取的金额
  • 安置日期
  • 交货日期
  • 产品标识
  • 客户识别码
作为一名用户,我希望能够查看这些采购订单的表列表,并在必要时对它们进行分组

详细信息:当对PurchaseOrder的集合进行分组时,该分组集合的行为应与PurchaseOrder完全相同,因为它必须在表中显示为记录,筛选操作应在分组的记录上工作,就像在单个PurchaseOrder实例上一样,分页和排序也是如此。此外,集团必须缓存或至少我是这样认为的,生产金额、从库存中取出的金额、所有放置日期中的最小放置日期以及最后但并非最不重要的最小交付日期的总和

我想在采购订单中隐式地建模如下:

Class PurchaseOrder < ApplicationRecord

    belongs_to :group, class_name: PurchaseOrder.model_name.to_s, inverse_of: :purchase_orders

    # purchase order can represent a "group" of purchase orders
    has_many :purchase_orders, inverse_of: :group, foreign_key: :group_id
 end
Class PurchaseOrder
通过这种方式,它将实现在表视图中轻松显示的目的,过滤分页和排序将立即生效,只需使用group_id nil对记录进行范围限定,就可以将分组的记录从表中删除

然而,我预见到了直接的缺点:

  • 在更新组成员属性(例如金额到产量)时,还应更新父缓存的金额到产量,其他三个属性也是如此。这可能会导致更新前的模型回调,我倾向于不使用它,除非它涉及单个实例本身的行为
  • 取消对成员分组时,将显示相同的历史记录
  • 销毁组中的成员时也是如此(这种情况可能发生,也将发生)
  • 1。我们可以暗示,不需要在父级PurchaseOrder中缓存金额或日期属性,因为我们可以覆盖这些属性的getter,并返回子级的总和/分钟(如果purchaseOrders.size.non-zero?),但是,这听起来好像有问题

    所以总结一下,如果不是最好的话,我想要一个乐观的方法来模拟这个场景,关于分组和取消分组成员的方法,关于什么是实现它的最佳域位置的想法,我正在考虑像Groupable这样的问题

    Pd:对于每个组,组的客户端id将是一个名为“多个客户”的默认种子客户端,并且产品id与子组的产品id相同,因为这是一个限制,只有具有相同产品id的采购订单才能分组,所以不能对具有不同产品id的组进行分组


    谢谢。

    我会将其分为两种型号,一种是PurchaseOrderGroup,另一种是PurchaseOrder

    class PurchaseOrderGroup < ApplicationRecord
      has_many :purchase_orders
      belongs_to :product
    
      def aggregate_pos
        PurchaseOrder.where(purchase_order_group_id: self.id).
          group(:purchase_order_group_id).
          pluck('sum(amount_to_produce), min(delivery_date), ...')
      end
    end
    
    class PurchaseOrder < ApplicationRecord
      belongs_to :purchase_order_group
    end
    
    class PurchaseOrderGroup
    我将为每个PurchaseOrder创建一个PurchaseOrderGroup,即使只有一个PurchaseOrder,它维护相同的接口。然后,您可以在PurchaseOrderGroup上定义委托方法,这些方法获取子级的适当总和、最小值、最大值等-聚合查询应该可以很快完成这项工作。请参见上面的聚合_pos()方法。很容易在PurchaseOrderGroup类中缓存结果。删除或添加PurchaseOrder对象很容易,只需再次调用aggregate_pos()

    这也解决了产品标识的难题,只需将该属性放在组上,而不是PurchaseOrder上。这样,同一组中的两个PurchaseOrder不可能有不同的产品ID