programing

delete_all vs destroy_all?

yellowcard 2023. 6. 4. 10:26
반응형

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

반응형