2011-01-28 7 views
1

Qu'est-ce qui me manque ici?Mongoid, impossible de faire du versionnage avec un document incorporé?

J'ai une structure relativement simple ici:

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 
    field :content 
    embedded_in :content, :inverse_of => :localized_contents 
end 

si je fais:

test = LocalizeContent.new(:locale => 'en', :content => 'blah') 
test.save 

=> ok, version = 1 

test.content = 'blah2' 
test.save 

=> ok, version = 2, versions.count = 1, etc. 

Tout est ok

Maintenant, si je le fais par le contenu, il ne fonctionne pas

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' 

Que puis-je faire? mal ici?!?

Merci, Alex

Répondre

0

MongoId :: Versioning et MongoId :: Paranoia ne fonctionnent pas avec les documents intégrés actuellement, malheureusement.

0

J'utilise mongo (1.9.1) & mongoid (2.7.1) et il semble y avoir un moyen de forcer les documents intégrés à être versionnés.

C'est kindof hackey - mais fondamentalement nous changeons le doc imbriqué, puis mettons à jour le champ 'previous_update' du document parent.

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 
Questions connexes