1

我有以下三个模型:

class ItemGroup
    include Mongoid::Document

    embeds_many :item_attributes

    field :name
end

class ItemAttribute
    include Mongoid::Document
    include Mongoid::History::Trackable

    embedded_in :item_group

    track_history :track_create => true

    field :name
    field :min
    field :max
    field :type

    embeds_many :item_attribute_values
end

class ItemAttributeValue
    include Mongoid::Document
    include Mongoid::History::Trackable

    embedded_in :item_attribute

    track_history :on => [:name, :order], :track_create => true, :scope => :item_group_attribute, :track_delete => true

    field :name
    field :order
end

如何使用它的一个例子:

item_group: {
  name: "Televisions",
  item_attributes: [
    { name: "Screen Size", min: 14, max: 90 type: "single" },
    { name: "Screen Type", min:0, max: 0, type: "multiple", item_attribute_values: [
        { name: "LCD", order: 0 },
        { name: "LED", order: 1 },
        { name: "Plasma", order: 2 }
     ]}
  ]
}

我真正关心的版本历史是 ItemAttributes。现在,如果 ItemAttribute 中的某些内容发生了更改(例如:名称、最小值、最大值或类型),则会创建一个新版本。但是,如果 ItemAttributeValue 被更新、删除或添加,它不会创建新的 ItemAttribute——这正是我们想要的。例如,如果有人将 ItemAttributeValue { name: 'CRT', order: 3 } 添加到“Screen Types”,则“Screen Types” ItemAttribute 应该获得一个新版本。版本 1 将具有“LCD”、“LED”、“等离子”,版本 2 将具有“LCD”、“LED”、“等离子”、“CRT”。如果有人删除了 ItemAttributeValue,那将创建另一个版本。

以前,ItemAttribute 没有嵌入到 ItemGroup 中,因此我能够使用 Mongoid::Versioning,并且完全按照我的意愿工作。但是,决定将 ItemAttribute 嵌入到 ItemGroup 中,我无法再使用 Mongoid::Versioning,所以我切换到 Mongoid::History::Tracks。这适用于跟踪模型内的更改,但它不跟踪模型嵌入文档的更新时间。

我开始认为我将不得不派生 mongoid_history 以添加具有选项或告诉 gem 跟踪模型嵌入文档的更新的功能。

以前有人遇到过这样的情况吗?

4

1 回答 1

1

找到了解决我的问题的 gem,mongoid-delorean。

于 2013-02-25T06:06:38.243 回答