diff --git a/CHANGELOG.md b/CHANGELOG.md index cf8b08a9..7519cd4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ### 0.6.2 (Next) * Your contribution here. +* [#191](https://github.com/mongoid/mongoid-history/pull/191): Track changes on embed_one - [@mateuspontes](https://github.com/mateuspontes). ### 0.6.1 (2017/01/04) diff --git a/lib/mongoid/history/attributes/update.rb b/lib/mongoid/history/attributes/update.rb index b1499285..c40ea638 100644 --- a/lib/mongoid/history/attributes/update.rb +++ b/lib/mongoid/history/attributes/update.rb @@ -13,6 +13,7 @@ def attributes @attributes[k] = format_field(k, v) end end + insert_embeds_one_changes_on_child if trackable_class.tracked_embeds_one.present? && changes.empty? @attributes end @@ -27,6 +28,22 @@ def insert_embeds_one_changes(relation, value) @attributes[relation][1] = value[1][paranoia_field].present? ? {} : format_embeds_one_relation(relation, value[1]) end + def insert_embeds_one_changes_on_child + trackable_class.tracked_embeds_one.each do |rel| + rel_class = trackable_class.embeds_one_class(rel) + paranoia_field = Mongoid::History.trackable_class_settings(rel_class)[:paranoia_field] + paranoia_field = rel_class.aliased_fields.key(paranoia_field) || paranoia_field + rel = aliased_fields.key(rel) || rel + obj = trackable.send(rel) + next if !obj || (obj.respond_to?(paranoia_field) && obj.public_send(paranoia_field).present?) + @attributes[rel] = {} + obj.changes.each do |k, v| + @attributes[rel] = [{ k => v.first }, { k => v.last }] + end + end + @attributes + end + def insert_embeds_many_changes(relation, value) relation = trackable_class.database_field_name(relation) relation_class = trackable_class.embeds_many_class(relation) diff --git a/spec/integration/nested_embedded_documents_tracked_in_parent_spec.rb b/spec/integration/nested_embedded_documents_tracked_in_parent_spec.rb index da83f082..fc63d6d7 100644 --- a/spec/integration/nested_embedded_documents_tracked_in_parent_spec.rb +++ b/spec/integration/nested_embedded_documents_tracked_in_parent_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe Mongoid::History::Tracker, focus: true do +describe Mongoid::History::Tracker do before :all do # Child model (will be embedded in Parent) class Child @@ -19,7 +19,7 @@ class Parent field :name, type: String embeds_one :child - track_history on: %i[(fields embedded_relations)], + track_history on: %i[fields embedded_relations], version_field: :version, track_create: true, track_update: true, @@ -37,10 +37,14 @@ class Parent expect(change.modified['name']).to eq('bowser') expect(change.modified['child']['name']).to eq('todd') + p.update_attributes(name: 'brow') + expect(p.history_tracks.length).to eq(2) + p.child.name = 'mario' p.save! - expect(p.history_tracks.length).to eq(2) + expect(p.history_tracks.length).to eq(3) + expect(p.history_tracks.last.original['child']['name']).to eq('todd') expect(p.history_tracks.last.modified['child']['name']).to eq('mario') end