2011-01-28 27 views
1

我在這裏錯過了什麼?Mongoid,無法對嵌入式文件進行版本控制?

我有一個相對簡單的結構,在這裏:

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 

如果我這樣做:

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

=> ok, version = 1 

test.content = 'blah2' 
test.save 

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

一切正常

現在,如果我這樣做,通過內容,這是行不通的

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' 

我是什麼doi這裏錯了嗎?!?

謝謝, 亞歷克斯

回答

0

Mongoid ::版本和Mongoid ::妄想不當前嵌入文檔,很遺憾。

0

我正在使用mongo(1.9.1)& mongoid(2.7.1),似乎有一種方法可以強制嵌入式文檔進行版本控制。

這是一種hackey - 但基本上我們改變嵌套文檔,然後更新父文檔的'previous_update'字段。

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