2010-06-15 4 views
17

내 질문은이 하나의 How to skip ActiveRecord callbacks?과 비슷하지만 AR 대신 Mongoid를 사용하고 있습니다. Mongoid의 현재 버전에서는 아직 구현되지 않은 것처럼 보이므로 어떤 멋진 솔루션을 사용해야하는지 알고 싶습니다. 그것을 구현하십시오. (필요하다면).몽고이 문서에서 콜백을 건너 뛰는 방법은 무엇입니까?

+0

Mongoid? Mongoid 1.9.0 또는 Mongoid 2.0.0.beta? – shingara

답변

28

예!

몽고 이드는 ActiveModel을 기반으로하며 ActiveModel은 skip_callback function입니다. 이 같은 skip_callback 사용할 수 있습니다

# skip the callback 
MyModelClass.skip_callback(:save, :before, :ensure_foo_is_not_bar) 

my_model_instance.update_attributes :foo => 'bar' 

# restore the callback for future calls 
MyModelClass.set_callback(:save, :before, :ensure_foo_is_not_bar) 

내가 이것을 사용하고 차질없이 큰 응용 프로그램에서. 더 많은 정보를 원하시면, 제프 Kreeftmeijer하여이 블로그 게시물을 참조 :

http://jeffkreeftmeijer.com/2010/disabling-activemodel-callbacks/

+0

아, 고마워! – jpemberthy

+0

'u.save! (validate : false)'가'u.save! (callbacks : false)' –

+0

고마워요. 당신이 유효성 검사를 끄는 것처럼 모든 콜백을 끄는 방법이 있다면 좋을 것입니다. , 내 테스트 스위트에서 콜백을 건너 뛰기위한이 작업. –

1

코드를 검색합니다. 그리고 Mongoid에서 콜백을 피할 방법이 없습니다. 버전 1.9 및 2.0 모두.

패치 나 기능 요청이 필요합니다.

+0

고마워요, 예 2.0.0.beta도 검토 중이었고 건너 뛰기 콜백 지원이 없었습니다 ... AR이 어떻게 실행하는지보고 mongoid 버전에 구현해 봅시다. – jpemberthy

14

Mongoid 원자 연산 (설정, 해제 등)을 사용하는 것이 더 쉬울 수 있습니다이 할

http://mongoid.org/en/mongoid/docs/persistence.html#atomic

을 콜백을하지 말라.

편집 : Mongoid 3는 콜백을 실행하지 않는다고 말합니다. 나는 몽고이 2에서 그들에게 콜백 콜을하고있다. 그래서 YMMV

+0

Mongoid 4에서도 잘 작동합니다. 계단식 콜백이 true로 설정된 부모 문서의 카운터를 가져 오는 방법을 알아 내려고 애쓰는 시간을 보냈습니다. – Dex

3

많은 양의 항목에 대해 모든 콜백을 실행하지 않고 업데이트를 수행하려는 경우에 종종 나타납니다. 드라이버에 내림차순으로 수행 할 수 있습니다.

'x'필드에서 'bar'로 'foo'를 바꾸십시오.

User.all.each do |u| 
    User.collection.where({ _id: u.id }).update({ 
    "$set" => { :x => u.x.gsub('foo', 'bar') 
    }) 
end 
7

나는 브라이언 암스트롱의 제안을 사용하여 간단하게 내 저장 후 콜백에서

person.set(name:"Robert Pulson") 

를 호출 끝났다.

+0

감사합니다 남자, 완벽한 +1 – rusllonrails

관련 문제