ActiveRecord 객체를 어떻게 삭제합니까?


답변:


572

그것 destroydestroy_all방법

user.destroy
User.find(15).destroy
User.destroy(15)
User.where(age: 20).destroy_all
User.destroy_all(age: 20)

또는 당신은 사용할 수 delete있으며 delete_all어떤 것을 강제 실행 :before_destroy하거나 :after_destroy콜백 하지 않거나 종속 연결 옵션을 사용할 수 있습니다.

User.delete_all(condition: 'value') 기본 키없이 레코드를 삭제할 수 있습니다

참고 : @hammady의 의견에서 user.destroyUser 모델에 기본 키가 없으면 작동하지 않습니다.

참고 2 : Rails 5.1에서는 @ pavel-chuchuva의 의견에서 destroy_all조건과 delete_all조건이 더 이상 사용되지 않습니다-guides.rubyonrails.org/5_1_release_notes.html 참조


4
답변에 @hammady의 의견을 포함시킬 수 있다면 좋을 것입니다. 모델 객체를 파괴 할 수없는 이유를 찾기 위해
고군분투했습니다


데이터베이스에서 deleted_at 열 데이터 만 업데이트하는 이유는 무엇입니까? 전체 데이터 행을 어떻게 삭제합니까?
TommyQu

1
조건이있는 destroy_all과 조건이있는 delete_all이 Rails 5.1에서 더 이상 사용되지 않습니다. guides.rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva

User.find_by(username:"bob") 역시 파괴하거나 삭제할 레코드를 식별하는 것이 좋다.
barlop

60

delete, delete_all, destroy,와 destroy_all.

: 워드 프로세서는 이전의 문서3.0.0 문서 레일

delete반면 객체를 인스턴스화하지는 않습니다 destroy. 일반적으로 delete보다 빠릅니다 destroy.


4
delete더 빠르지 만 모델에서 정의한 콜백을 무시합니다.
Rudi

48
  1. User.destroy

User.destroy(1)와 사용자를 삭제 id == 1하고 :before_destroy:after_destroy콜백이 발생합니다. 예를 들어 관련 레코드가있는 경우

has_many :addresses, :dependent => :destroy

사용자가 파괴되면 그의 주소도 파괴됩니다. 삭제 동작을 대신 사용하면 콜백이 발생하지 않습니다.

  1. User.destroy, User.delete

  2. User.destroy_all(<conditions>) 또는 User.delete_all(<conditions>)

공지 : 사용자는 클래스이고 사용자는 인스턴스 객체입니다


3
관련 레코드를 처리해 주셔서 감사합니다.
Sage Mitchell

2
BEWARE : User.destroy_all()콜백을 실행하므로 삭제하기 전에 레코드를로드합니다. 하나가 아닌 두 개의 SQL 문입니다. 성능 관련 사항 외에도 동시성에도 영향을 미칩니다. 보다 안전한 통화는 콜백을 건너 뜁니다. User.delete_all()하나의 DELETE FROM...명령 만 발행 합니다.
앤드류 호 지킨 슨 1

1
조건이있는 destroy_all은 Rails 5.1에서 더 이상 사용되지 않습니다. guides.rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.