开发者

Mongoid, can't make versioning work with embedded document?

开发者 https://www.devze.com 2023-02-07 08:59 出处:网络
What am I missing here ? I have a relative simple structure here: Class Content include Mongoid::Document

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
0

精彩评论

暂无评论...
验证码 换一张
取 消