2014-05-14 1 views
2

has_and_belongs_to_many 관계가있는 두 개의 모델이 있습니다.Mongoid의 관련 has_and_belongs_to_many 모델에 updated_at 업데이트

class Person 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    has_and_belongs_to_many :stories; 
end 

class Story 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    has_and_belongs_to_many :people; 
end 

나는 사람에게 이야기를 추진하기 위해 노력하고있어,

Person.stories << Story.first 

내가 사람의 updated_at 필드를 업데이트 할이 기대하고있다. 그러나 그것은 업데이트되지 않습니다. 입력란을 업데이트하는 방법이 있습니까? 나는 터치를 사용해야합니까?

답변

2

이것은 this GitHub issue에서 논의됩니다. 새 오브젝트가 추가되면 기본 오브젝트가 갱신되지 않습니다. belongs_to을 사용하는 경우 touch: true을 추가 할 수 있지만 그렇지 않습니다.

문제에 대한 설명에서 관련 개체에 after_save을 추가하는 것이 좋습니다. 이 경우 릴레이션의 양쪽에 다음을 추가해야합니다.

class Person 
    after_save do 
    stories.each(&:touch) 
    end 
end 

class Story 
    after_save do 
    people.each(&:touch) 
    end 
end 

우아하지만 덜 효과적일까요?

+1

미래의 독자에 "도메인 로직에 대한 콜백을 사용하여 나쁜 디자인 연습이다, 체인의 콜백이 실행을 정지 할 때 디버그하기 어려운 예기치 않은 오류가 발생할 수 있습니다. 백그라운드 작업을 대기 행렬에 넣는 것과 같은 교차하는 문제에만 사용하는 것이 좋습니다. "(http://mongoid.org/en /mongoid/docs/callbacks.html) – Geoffroy

+1

이것은 OP가 묻는 것 이외의 일을하는 것으로 보입니다 : 부모가 업데이트 될 때 Child 객체를 만지는 것 ... Children이 association에 추가되거나 제거 될 때 Parent를 만지는 것보다. – ericpeters0n

0

그의 의견에 언급 된대로 ericpeters0n은 부모가 업데이트 될 때 Child 개체를 만지는 방법 만 보여줍니다.

는 아이들이 협회에서 추가/제거 할 때 부모 개체를 터치합니다, 당신은 간단하게 수행 할 수 있습니다

내용
class Person 
    after_save :touch 
end 

class Story 
    after_save :touch 
end