2017-11-16 2 views
0

내 모델에서 after_find를 사용하고 있지만 경우에 따라 사용을 중지하고 싶습니다. 그리고 난 을 사용하고 있습니다. 여전히 after_find가 실행 중이지만 문서에서는 다음과 같은 방법으로 만 작동한다고합니다. 왜 그래야만하지?일부 경우에만 after_find를 사용 중지하는 방법이 있습니까

all 
first 
find 
find_by 
find_by_* 
find_by_*! 
find_by_sql 
last 

내 API (포도 프레임 워크)를 after_find 콜백이 where 호출에 의해 호출되지 않는

delete '/delete_user' do 
    user_id = params[:user_id] #authenticate_current_user! 
    @user_profile = ::UserProfile.where(user_id: user_id). 
    @user_profile.destroy_all 
end 
+0

정보를 얻은 문서는 어느 것입니까? [rails documentation] (http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html)은 다음과 같이 말합니다 : "파인더에 의해 발견되고 인스턴스화 된 각 객체에 대해'after_find' 및'after_initialize' 콜백이 트리거됩니다 "*. 그리고'find_by_ *'메소드는 v4 이후에 코어 레일에서 더 이상 사용되지 않거나 제거되었으며 레일 5에서 완전히 제거되었습니다. –

+0

코드를 보여 주시겠습니까? "어떤 경우에는 사용 중지"란 무엇을 의미합니까? 'after_find'를 전혀 포함하지 않는 문제에 대한 더 깔끔한 해결책이있을 수 있습니다. –

+0

http://guides.rubyonrails.org/active_record_callbacks.html에서 확인하십시오. 코드도 추가했습니다. –

답변

0

이다; 귀하의 destroy_all 전화로 호출되었습니다. destroy_all은 각 객체 (및 관련 객체)를 인스턴스화하고 destroy 메소드를 하나씩 호출합니다.

당신이 그들을 인스턴스 (및 모든 콜백을 건너 뛰는)없이, 즉시 모든 UserProfile 개체를 삭제하고 싶은 경우에, 당신은 호출 할 수

UserProfile.where(user_id: user_id).delete_all 
destroy_all and delete_all의 차이점에 대한

자세한 정보는에서 찾을 수 있습니다 당신이 걱정하는 다른 StackOverflow의에 대한 답변,하지만 차이점은 다음과 같습니다

  1. 는 기록을 인스턴스화하지 않습니다
  2. 그것은 당신이 after_find 당신이 그것을 사용하는 방법을 사용하지 않는 것이 좋습니다 것입니다 그것이 어떤 콜백

를 호출하지 않습니다 연관된 객체

  • 삭제되지 않습니다. lots of ways to skip callbacks이지만 almost nobody uses after_find이 있습니다. (예 : after_create과 비교)

    after_find 콜백을 건너 뛰는 옵션은 제한되어 있습니다. 이를 수행하는 데는 built-in Rails methods이 없습니다. 당신은 당신이 생각하고 시작해야 그런 조건을 사용하는 경우

    after_find :foo, if: -> { <some logic> } 
    

    : 당신이 절대적으로 콜백을 유지해야하는 경우 (위에서 설명 된 경우를 제외하고), 다음 가장 좋은 방법은 콜백 정의에 조건을 추가하는 것입니다 이 변수가 다중 스레드 환경에서 읽히고 설정되는 방법과 경쟁 조건을 만들지 않고 동시 요청을 처리하는 방법은 설명 된대로 after_find을 사용하지 않음으로써 더 잘 처리되는 추악한 경로를 보냅니다.

  • +0

    아니요. ** 콘솔에서 ** ** 절을 사용하여, after_find가 호출됩니다. 예 : User.where (id : 2)는 after_find 메소드를 호출합니다. –

    +0

    @shahanahamza 그 이유는 콘솔에서만 실행하기 때문입니다. 콘솔에서'UserProfile.where'를 실행하면'irb'은 각 레코드를 인스턴스화하여 편리하게 표시 할 수 있습니다. 'irb '가 레코드를 인스턴스화하면'after_find' 콜백이 발생합니다. 콘솔이 레코드를 인스턴스화하여 보여주기 때문에 * 만 * 발생합니다. – anothermh

    관련 문제