복붙노트

[RUBY-ON-RAILS] 파괴와 삭제의 차이

RUBY-ON-RAILS

파괴와 삭제의 차이

차이 사이는 무엇인가

@ model.destroy 및 @ model.delete

예를 들면 :

Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all

나는 둘 중 하나를 사용하는 경우 정말 중요합니까?

해결법

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

    1.삭제하지 않는 동안 기본적으로 모델에서 실행되는 어떤 콜백을 파괴한다.

    삭제하지 않는 동안 기본적으로 모델에서 실행되는 어떤 콜백을 파괴한다.

    레일 API에서 :

  2. ==============================

    2.전용 DB에서 관련 어린이의 기록 DB에서가 아니라 현재의 오브젝트 레코드를 삭제합니다 삭제합니다.

    전용 DB에서 관련 어린이의 기록 DB에서가 아니라 현재의 오브젝트 레코드를 삭제합니다 삭제합니다.

    DB에서 관련 아동 기록도 DB에서 현재 개체 기록을 삭제합니다 파괴한다.

    이들의 사용은 정말 중요한 :

    당신의 여러 부모 객체가 일반적인 아이들 객체를 공유하는 경우, 다른 여러 부모들 사이에서 공유되는 아이들의 개체를 삭제합니다 특정 상위 개체에 파괴 호출.

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

    3.당신이 파괴 또는 액티브 오브젝트에 destroy_all 호출 할 때, 액티브 '파괴'과정이 시작됩니다, 그것은, 클래스 당신에게있는 거 삭제는, 그것이 종속성을 무엇을해야하는지 결정 등의 검증을 통해 실행을 분석

    당신이 파괴 또는 액티브 오브젝트에 destroy_all 호출 할 때, 액티브 '파괴'과정이 시작됩니다, 그것은, 클래스 당신에게있는 거 삭제는, 그것이 종속성을 무엇을해야하는지 결정 등의 검증을 통해 실행을 분석

    삭제 또는 객체에 DELETE_ALL 호출하면, 액티브 단지 TABLENAME에서 DELETE를 실행하려고 WHERE 다른 ​​액티브 수준의 작업을 수행하지 않는 DB에 대한 조건 쿼리.

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

    4.예를 두 가지 방법 사이의 차이가 큰 사용 DELETE_ALL 당신은 기록이 모델 콜백을 호출하지 않고 신속하게 삭제하려면

    예를 두 가지 방법 사이의 차이가 큰 사용 DELETE_ALL 당신은 기록이 모델 콜백을 호출하지 않고 신속하게 삭제하려면

    당신이 당신의 모델에 관심 있다면 콜백은 다음 destroy_all를 사용

    공식 문서에서

    http://apidock.com/rails/ActiveRecord/Base/destroy_all/class

  5. ==============================

    5.기본적으로 "삭제"레코드를 삭제하기 위해 데이터베이스에 직접 쿼리를 보냅니다. 이 경우 레일에 (예 : before_destroy 같은) 어떤 콜백이있는 경우 속성이도 삭제됩니다 레코드에 무엇인지 알 수 없습니다.

    기본적으로 "삭제"레코드를 삭제하기 위해 데이터베이스에 직접 쿼리를 보냅니다. 이 경우 레일에 (예 : before_destroy 같은) 어떤 콜백이있는 경우 속성이도 삭제됩니다 레코드에 무엇인지 알 수 없습니다.

    은 "파괴"방법은 전달 된 ID를한다 "찾기"방법을 사용하여 데이터베이스에서 모델을 가져, 다음 호출은에 파괴한다. 이 콜백이 트리거되는 것을 의미한다.

    당신은 당신이 콜백이 트리거 또는 더 나은 성능을 원하는하지 않으려면 "삭제"를 사용할 것입니다. 그렇지 않으면 (대부분의 시간) 당신은 "파괴"를 사용하는 것이 좋습니다.

  6. ==============================

    6.이미 답변을 많은; 좀 더와에 뛰어 싶었다.

    이미 답변을 많은; 좀 더와에 뛰어 싶었다.

    문서 :

    삭제 verbage를가 액티브 :: Association.has_many 및 액티브 :: 자료에 대해 다르게 작동합니다. 후자의 경우, SQL 삭제하고 모든 검증 / 콜백 바이 패스 실행됩니다 삭제합니다. 협회에 전달 따라 옵션 : 전자가에 따라 실행됩니다. 그러나, 테스트 기간 동안, 나는 콜백은 삭제하지 DELETE_ALL에 대해 실행 된 다음과 같은 부작용을 발견

    의존 : 예를 파괴 :

    class Parent < ApplicationRecord
       has_many :children,
         before_remove: -> (_) { puts "before_remove callback" },
         dependent: :destroy
    end
    
    class Child < ApplicationRecord
       belongs_to :parent
    
       before_destroy -> { puts "before_destroy callback" }
    end
    
    > child.delete                            # Ran without callbacks
    Child Destroy (99.6ms)  DELETE FROM "children" WHERE "children"."id" = $1  [["id", 21]]
    
    > parent.children.delete(other_child)     # Ran with callbacks
    before_remove callback
    before_destroy callback
    Child Destroy (0.4ms)  DELETE FROM "children" WHERE "children"."id" = $1  [["id", 22]]
    
    > parent.children.delete_all              # Ran without callbacks
    Child Destroy (1.0ms)  DELETE FROM "children" WHERE "children"."parent_id" = $1  [["parent_id", 1]]
    
  7. from https://stackoverflow.com/questions/22757450/difference-between-destroy-and-delete by cc-by-sa and MIT license