>
Rails 5에서 파괴를 막는 유일한 방법은 throw(:abort) 에 전화하는 것입니다 ;그리고 이것은 예상대로 작동합니다. 그러나 내가 겪고있는 문제는 레코드가 요구 사항을 충족하지 않고 파괴하지 않고 레코드를 수정하려는 경우입니다. 그러나 throw(:abort)   전체 거래가 되돌리고 레코드가받은 변경 사항을 취소합니다.

이를 달성하는 방법에 대한 제안이 있으십니까?

class Thing < ApplicationRecord
  before_destroy :can_destroy?
  private
  def can_destroy?
    if model.something?
      self.update(something: 'foo') # This part is not being retained.
      throw(:abort)
  end
end


  • 답변 # 1

    당신이 겪고있는 문제는 ActiveRecord가 트랜잭션의 모든 전후 콜백을 트랜잭션으로 래핑하여 실패 할 경우 데이터베이스에 결과가 커밋되지 않도록하는 것입니다. 슬프게도, 당신은 당신을 보호하려고하는 것을 정확하게하고 싶습니다. 이 작업을 수행하는 "좋은"방법은 없지만이 제한을 극복하기위한 약간의 해킹은 after_rollback 에서 업데이트를 수행하는 것입니다.  당신의 throw(:abort) 때문에 콜백  트랜잭션 롤백이 발생합니다. 예를 들면 다음과 같습니다.

    class Thing < ApplicationRecord
      before_destroy :can_destroy?
      after_rollback :can_destroy_callbacks
      private
      def can_destroy?
        if model.something?
          @update_later = true
          throw(:abort)
        end
      end
      def can_destroy_callbacks
        if @update_later
          update(something: 'foo')
        end
      end
    end
    
    

  • 이전 Visual Studio에서 exe C # 파일을 어떻게 생성합니까?
  • 다음 Haskell에서 코드를 우아하게 만드는 방법?