次の3つのモデルがあります。
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 で何かが変更された場合 (例: name、min、max、または type )、新しいバージョンが作成されます。ただし、ItemAttributeValue が更新、削除、または追加された場合、新しい ItemAttribute は作成されません。これが必要です。たとえば、誰かが ItemAttributeValue { name: 'CRT', order: 3 } を「スクリーン タイプ」に追加した場合、「スクリーン タイプ」ItemAttribute は新しいバージョンを取得する必要があります。バージョン 1 には「LCD」、「LED」、「プラズマ」があり、バージョン 2 には「LCD」、「LED」、「プラズマ」、「CRT」があります。また、誰かが ItemAttributeValue を削除すると、さらに別のバージョンが作成されます。
以前は、ItemAttribute は ItemGroup に埋め込まれていなかったので、Mongoid::Versioning を使用することができました。それはまさに望みどおりに機能しました。しかし、ItemGroup 内に ItemAttribute を埋め込むことが決定され、Mongoid::Versioning を使用できなくなったため、Mongoid::History::Tracks に切り替えました。これは、モデル内の変更の追跡には問題なく機能しますが、モデルに埋め込まれたドキュメントが更新されたときは追跡されません。
モデルに埋め込まれたドキュメントの更新を追跡するように宝石に指示するオプションまたは何かを追加する機能を追加するには、mongoid_history をフォークする必要があると考え始めています。
前にこのような状況に遭遇した人はいますか?