What am I missing here ?
I have a relative simple structure here:
Class Content
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::Paranoia
field :title
embeds_many :localized_contents
end
Class LocalizedContent
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::Paranoia
include Mongoid::Versioning
field :locale
开发者_StackOverflow field :content
embedded_in :content, :inverse_of => :localized_contents
end
if I do:
test = LocalizeContent.new(:locale => 'en', :content => 'blah')
test.save
=> ok, version = 1
test.content = 'blah2'
test.save
=> ok, version = 2, versions.count = 1, etc.
All is ok
Now if I do this through Content, it does not work
test = Content.first.localised_contents.build(:locale => 'en', :content => 'blah')
test.save
=> ok, version = 1
test = Content.first.localized_contents.first
test.content = 'blah2'
test.save
=> KO, version = 1, versions.count = 0, but
Content.first.localized_contents.first.content == 'blah2'
What am I doing wrong here ?!?
Thanks, Alex
Mongoid::Versioning and Mongoid::Paranoia don't work with embedded documents currently, unfortunately.
I'm using mongo (1.9.1) & mongoid (2.7.1) and there seems to be a way to force embedded docs to be versioned.
This is kindof hackey - but basically we change the nested doc, then update the 'previous_update' field of the parent document.
params = { 'env_name' => 'changeme-qa', 'machine' => {'_id' =>"51f85846f0e1801113000003", 'status' => "described#{version}" }}
env = Environment.find_with_name(params['env_name'])
result = env.machines.where(:_id => params['machine']['_id'])
machine = (result.exists?) ? machine = result.first : nil
if machine.nil?
raise 'failed to find machine'
else
if machine.update_attributes(params['machine'])
env.reload
# here's the magic, since we cause a change in the parent (environment) record,
# the child records get versioned
env['previous_update'] = env['updated_at']
env.save
else
raise 'failed to save'
end
end
精彩评论