데이터베이스 테이블에서 모든 레코드 삭제


답변:


249

SQL없이 방법을 찾고 있다면 delete_all을 사용할 수 있어야합니다.

Post.delete_all

또는 기준

Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"

자세한 내용은 여기 를 참조하십시오.

레코드는 먼저로드하지 않고 삭제되므로 매우 빠르지 만 삭제시 실행되는 레일 코드에 따라 카운터 캐시와 같은 기능이 중단됩니다.


13
: dependent => : destroy와 연관이 있거나 삭제시 정리 해야하는 항목이 있다면 Post.destroy_all을 원할 것입니다. apidock.com/rails/ActiveRecord/Base/destroy_all/class
Michael Hellein

이 답변은 테이블에 연결된 모델이 있다고 가정합니다. OP는 이것을 지정하지 않았습니다. 테이블이 조인 테이블이면 어떻게됩니까?
Toby 1 Kenobi

1
@BradWerth 어떤 사람들이 좋은 스타일 또는 나쁜 스타일로 간주하는지 여부는 Rails db에 ActiveRecord모델 이 아닌 테이블이있는 것이 가능하다고 말하고 있습니다 . 질문은 '테이블'에서 레코드를 삭제하는 것에 대해 묻고 대답을하고 있거나 가정하고 있습니다.
Toby 1 Kenobi

@ Toby1Kenobi와 동일한 쿼리가 있습니다.
nbsamar

30

SQL을 통해 삭제하려면

Item.delete_all # accepts optional conditions

각 모델의 destroy 메소드를 호출하여 삭제하려면 (비싸지 만 콜백이 호출되도록 함)

Item.destroy_all # accepts optional conditions

여기 전부


21

데이터베이스를 완전히 비우고 연결된 모델을 삭제하지 않고 다음을 수행 할 수 있습니다.

rake db:purge

당신은 또한 테스트 데이터베이스에서 할 수 있습니다

rake db:test:purge

5

모든 모델의 모든 인스턴스를 삭제한다는 의미라면

ActiveRecord::Base.connection.tables.map(&:classify)
  .map{|name| name.constantize if Object.const_defined?(name)}
  .compact.each(&:delete_all)

1
선호 select하면, 블록 내부에있는 경우 표현식을 사용하는 체인은 피하기 이런 식으로 전무 요소를 제거 할 수있는 컴팩트 한 방법을 필요로 할 때마다.
Sebastian Palma

4
BlogPost.find_each(&:destroy)

메모리가 부족한 환경에 적합합니다.
Epigene

이것은 메모리 소비를 고려한 유일한 대답입니다.
John

2
세상에, 왜 이것에 대해 루프를 만들어야합니까? 모든 레코드 삭제 DELETE FROM 테이블, Model.delete_all
Imnl

@John 왜 하나의 단일 쿼리가 쿼리 루프보다 많은 메모리를 소비합니까?
Imnl

@Imnl 각 반복은 해당 모델의 새 인스턴스를 인스턴스화하여 delete 메소드의 콜백을 처리 할 수 ​​있도록합니다.
John

2

모델의 이름이 BlogPost 인 경우 다음과 같습니다.

BlogPost.all.map(&:destroy)

이렇게하면 모든 단일 블로그 게시물을 가져 와서 파괴하기 전에 Ruby 배열에로드합니다.
hdgarrood

ORM에 따라 다릅니다. Datamapper는 각 모델에 대해 아무것도 요청하지 않기 때문에 그렇게하지 않습니다. 그리고 다음은 각 항목을 파괴하기 전에 어떤 필드도 선택하지 않음을 보여주는 Mongoid 스택 트레이스입니다.MOPED: 127.0.0.1:27017 QUERY database=a_database collection=nothings selector={} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.3378ms)
stef

4
그가 사용하고 ORM하는 그것이 레일 질문, 그리고 아스 커 말했다되지 않았기 때문에, 우리는 액티브 가정해야
hdgarrood

2

모든 테이블의 모든 항목을 삭제하려는 경우 최신 답변 :

def reset
    Rails.application.eager_load!
    ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration  }
end

eager_load 여기 에 대한 자세한 정보 .

그것을 호출 한 후, 우리는 모든 자손에게 접근 ActiveRecord::Base할 수 있고 delete_all모든 모델에 적용 할 수 있습니다 .

SchemaMigration 테이블을 지우지 마십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.