我在这里缺少什么?
我的结构相对简单:
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'
我在这里做错了什么?!?
谢谢, 亚历
答案 0 :(得分:0)
Mongoid ::版本控制和Mongoid ::不幸的是,偏执狂目前不适用于嵌入式文档。
答案 1 :(得分: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