복붙노트

[RUBY-ON-RAILS] 어떻게 액티브 콜백을 건너 뛰려면? [복제]

RUBY-ON-RAILS

어떻게 액티브 콜백을 건너 뛰려면? [복제]

이 같은 모델을 가지고

class Vote < ActiveRecord::Base  
    after_save :add_points_to_user

    .....
end

어떻게 든 저장할 때 add_points_to_user를 호출 건너 모델을 강제 할 수 있습니까? 액티브 # 파괴 대 아마도 액티브 번호 같은 것을 삭제?

해결법

  1. ==============================

    1.레일이 들어 있지만 3 당신이 사용할 수 있습니다 레일 :

    레일이 들어 있지만 3 당신이 사용할 수 있습니다 레일 :

    object.send(:create_without_callbacks)
    object.send(:update_without_callbacks)
    
  2. ==============================

    2.레일 3의 경우, ActiveSupport :: 콜백 당신에게 필요한 제어 할 수 있습니다. 난 그냥 필요한 일반적으로 바람직하지-콜백을 일축 할 수있는 데이터 통합 ​​시나리오에서 같은 도전에 직면했다. 당신은 reset_callbacks EN-한꺼번에, 또는 사용 skip_callback는 다음과 같이 신중하게 비활성화 할 수 있습니다 :

    레일 3의 경우, ActiveSupport :: 콜백 당신에게 필요한 제어 할 수 있습니다. 난 그냥 필요한 일반적으로 바람직하지-콜백을 일축 할 수있는 데이터 통합 ​​시나리오에서 같은 도전에 직면했다. 당신은 reset_callbacks EN-한꺼번에, 또는 사용 skip_callback는 다음과 같이 신중하게 비활성화 할 수 있습니다 :

    Vote.skip_callback(:save, :after, :add_points_to_user)
    

    ..after 당신이 투표 인스턴스에서 작동 할 수있는 : add_points_to_user 억제

  3. ==============================

    3.다음은, 레일 (2)에 적용되는 3 레일과 레일 4 :

    다음은, 레일 (2)에 적용되는 3 레일과 레일 4 :

    http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#skipping-callbacks

    신중하게 고려하지 않고 그들을 사용하는 위험한 이유를 설명, 콜백을 건너 방법의 목록을 제공합니다. 크리에이티브 커먼즈 저작자 표시 - 동일 조건 변경 허락 3.0 라이선스의 규정에 따라 여기 재판.

  4. ==============================

    4.이것은 당신의 검증을 생략 할 것이다 :

    이것은 당신의 검증을 생략 할 것이다 :

    vote.save(:validate => false)
    

    여기에 더 많은 정보

    당신의 콜백 및 검증을 생략하려면 V (3.1), 또는 update_all update_column 사용할 수 있습니다

    vote = Vote.first
    vote.update_column(:subject, 'CallBacks')
    

    Aparentlly 이것은 단지 액티브 3.1와 함께 작동

    또는:

    Vote.where('id = ?', YourID).update_all(:subject => 'CallBacks')
    

    결국 당신은 또한 내가 마지막으로 옵션이이 모든 것을 건너 뜁니다 :

    execute "UPDATE votes SET subject = 'CallBacks' WHERE id = YourID"
    

    OK 마지막은 그렇게 꽤 아니다.

  5. from https://stackoverflow.com/questions/1342761/how-to-skip-activerecord-callbacks by cc-by-sa and MIT license