delete_all vs destroy_all?
테이블에서 레코드를 삭제하는 최선의 방법을 찾고 있습니다.예를 들어, 사용자 ID가 여러 테이블에 걸쳐 있는 사용자가 있습니다.이 사용자와 모든 테이블에 ID가 있는 모든 레코드를 삭제합니다.
u = User.find_by_name('JohnBoy')
u.usage_indexes.destroy_all
u.sources.destroy_all
u.user_stats.destroy_all
u.delete
이것은 작동하고 모든 테이블에서 사용자의 모든 참조를 제거하지만, 저는 그것을 들었습니다.destroy_all
공정이 매우 무거워서, 저는 노력했습니다.delete_all
사용자를 자신의 사용자 테이블에서 제거할 뿐입니다.id
다른 모든 테이블에서 null로 설정되지만 레코드는 그대로 유지됩니다.이와 같은 작업을 수행하기 위한 올바른 프로세스가 무엇인지 누군가 공유할 수 있습니까?
나도 그것을 알아.destroy_all
를 호출합니다.destroy
모든 관련 개체에서 작동하지만 올바른 접근 방식을 확인하고 싶습니다.
맞아요.사용자 및 모든 관련 개체를 삭제하려면 ->destroy_all
단, 연관된 모든 객체를 억제하지 않고 사용자만 삭제하고자 하는 경우 ->delete_all
이 게시물에 따르면 :Rails :dependent => :dependent VS :dependent => :delete_all
destroy
/destroy_all
연결된 개체는 제거 메서드를 호출하여 이 개체와 함께 제거됩니다.delete
/delete_all
연결된 모든 개체는 :destroy 메서드를 호출하지 않고 즉시 삭제됩니다.
delete_all은 단일 SQL DELETE 문이며 그 이상이 아닙니다. destroy_all 호출은 최소한 NUM_OF_RESULTS SQL 문일 수 있는 조건(있는 경우)의 모든 일치 결과에서 파괴()됩니다.
만약 당신이 대규모 데이터 세트에서 destroy_all()과 같은 극단적인 일을 해야 한다면, 나는 아마도 앱에서 그것을 하지 않고 조심스럽게 수동으로 처리할 것입니다.데이터 세트가 충분히 작으면 그만큼 아프지 않을 것입니다.
라는 사실을 피하기 위해destroy_all
모든 레코드를 인스턴스화하고 한 번에 하나씩 삭제합니다. 모델 클래스에서 직접 사용할 수 있습니다.
그래서 대신에:
u = User.find_by_name('JohnBoy')
u.usage_indexes.destroy_all
할 수 있는 일:
u = User.find_by_name('JohnBoy')
UsageIndex.destroy_all "user_id = #{u.id}"
결과는 하나의 쿼리로 모든 관련 레코드를 삭제합니다.
어떤 상황에서는 수동으로 관련 레코드를 삭제해야 하는 필요성을 줄일 수 있는 작은 보석을 만들었습니다.
이 보석은 ActiveRecord 연결에 대한 새로운 옵션을 추가합니다.
종속::delete_incretive
레코드를 삭제하면 이 옵션을 사용하여 연결된 모든 레코드가 인스턴스화되지 않고 재귀적으로(즉, 모델 전체에서) 삭제됩니다.
dependent::delete 또는 dependent::delete_all과 마찬가지로 이 새 옵션은 종속 레코드의 around/before/after_destroy 콜백을 트리거하지 않습니다.
그러나 종속::destroy 연결은 종속::delete_recursive와 연결된 모델 체인 내의 임의의 위치에 있을 수 있습니다.:destroy 옵션은 모든 관련 레코드를 인스턴스화하고 파기하여 콜백을 트리거하는 등 라인의 위쪽 또는 아래쪽 어디에서나 정상적으로 작동합니다.
언급URL : https://stackoverflow.com/questions/6698207/delete-all-vs-destroy-all
'programing' 카테고리의 다른 글
Git에서의 병합이 SVN에서의 병합보다 어떻게 그리고/또는 왜 더 낫습니까? (0) | 2023.06.04 |
---|---|
Struct를 사용해야 하는 경우와OpenStruct? (0) | 2023.06.04 |
HTML을 사용하여 문서의 모든 인쇄 페이지에서 머리글과 바닥글을 인쇄하는 방법은 무엇입니까? (0) | 2023.06.04 |
안드로이드 애플리케이션에서 이메일을 보내는 방법은 무엇입니까? (0) | 2023.06.04 |
bash의 디렉토리에서 임의 파일을 선택하려면 어떻게 해야 합니까? (0) | 2023.06.04 |