2010-11-23 2 views
2

더러운 개체를 추적해야했습니다. 부모 인 doc과 잘 작동합니다. 하지만 임베디드 또는 doc에서 참조 된 것을 변경하면 더러운 에 doc 자체에서 임베디드/참조를 통해 액세스해야합니다.Mongoid의 상위 문서에 포함 된 문서를 더티 추적

부모 문서 자체의 더티를 어떻게 추적 할 수 있습니까 ??

답변

1

Mongoid 자신의 더러운 특성이 포함 된 문서의 변경 내용을 추적한다고 생각하지 않습니다. 당신이 Bar.changes에 포함 된 문서의 변경을 포함하거나 특정 변경을 추적하는 등 더 많은 옵션을, 필요하면

class Bar 
    include Mongoid::Document 
    embeds_many :foos 
    attr_accessor :foos_changed 
    alias_method :foos_changed?, :foos_changed 
    # ... 
end 

class Foo 
    include Mongoid::Document 
    embedded_in :bar, :inverse_of => :foos 
    after_save :notify_parent 
    def notify_parent 
    bar.foos_changed = true 
    end 
    # ... 
end 

b = Bar.create 
b.foos_changed? # => nil 
b.foos.create 
b.foos_changed? # => true 

, 당신은 무시해야합니다 :하지만이 같은 내장 문서를 자신의 기본 더러운 추적을 구현하기 어렵지 않다 changeschanged? 방법을 사용합니다. 이러한 기능이 절대적으로 필요하지 않으면 내가하지 않을 것입니다. 나는이 문제 https://github.com/versative/mongoid_relations_dirty_tracking를 해결하기 위해 함께 mongoid 확장을 뒀다

class Bar 
    include Mongoid::Document 
    embeds_many :foos 
    attr_writer :embedded_changes 
    def embedded_changes 
    @embedded_changes ||= begin 
     self._children.inject({}) do |memo, child| 
     memo.merge( 
     {child.collection_name => {child.id => child.changes}} 
     ) if child.changed? 
     end 
    end 
    end 

    def changes 
    original_value = super 
    if original_value.blank? 
     embedded_changes 
    else 
     original_value.merge(embedded_changes) 
    end 
    end 

    def changed? 
    super || self._children.any?(&:changed?) 
    end 
    # ... 
end 

class Foo 
    include Mongoid::Document 
    embedded_in :bar, :inverse_of => :foos 
    # ... 

    field :hat 
end 

b = Bar.create 
f = b.foos.create 
b.changes # => nil 
b.changed? # => false 
f.hat = 1 
f.changes # => {"hat"=>[nil, "1"]} 
b.changes # => {"foos"=>{BSON::ObjectId('4cf...')=>{"hat"=>[nil, "1"]}}}  
b.changed? # => true 
+0

답변 해 주셔서 감사합니다. 그 거의 나는 약간의 여분의 물건으로 원했다. – Autodidact

+0

내가 원하는 것은 foo가 바뀔 때마다, bar.changed를 통해 알고 싶습니까? 및 bar.changes 이러한 값을 제공합니다. 당신이 말했듯이, 내 필요는 변화를 무시하고 바꿀 것을 요구합니까? 행동 양식. 그러나 그것을하는 방법? – Autodidact

+0

위의 업데이트 된 답변을 참조하십시오. 'changes'와'changed? '를 오버라이드 할 때 조심하십시오. 복잡한 문서에서는 이상한 일이 발생할 수 있습니다. 몽고이 만이 더러운 속성과 더러운 연관을 추적하지 않는 이유가 있습니다. – bowsersenior

2

:

여기에 포함 된 문서에서 변경된 것을 추적 할 수있는 방법입니다. mongoid가 속성에 대해 수행하는 것과 유사한 방식으로 문서 관계의 변경 사항을 추적하기 만하면 타임 스탬프와 버전이 올바르게 업데이트됩니다.

+0

mongoid 6과 5에서는 작동하지 않습니다. –

관련 문제