레일 가이드에서 다음과 같이 설명됩니다.
에 연결된 경우 객체가 추가로 삭제되고 연결된
:dependent => :destroy
경우 삭제됩니다.:dependent => :delete_all
맞아요 그러나 파괴와 삭제의 차이점은 무엇입니까? 나는 두 가지를 모두 시도했지만 같은 일을하는 것 같습니다.
답변
차이점은 콜백입니다.
:delete_all
응용 프로그램에서 직접 및 SQL에 의해 삭제됩니다 :
DELETE * FROM users where compagny_id = XXXX
를 사용하면 :destroy
모든 자녀를 인스턴스화 할 수 있습니다. 따라서 파괴 할 수 없거나 각자 고유 :dependent
한 콜백을 호출 할 수 있습니다.
답변
Rails의 모델 연관에서 :dependent
옵션을 지정할 수 있으며, 다음 세 가지 형식 중 하나를 취할 수 있습니다.
:destroy/:destroy_all
연관된 객체는destroy
메소드 를 호출하여이 객체와 함께 파괴됩니다.:delete/:delete_all
모든 관련 객체는:destroy
메소드 를 호출하지 않고 즉시 파괴됩니다.:nullify
연결된 모든 객체의 외래 키는 콜백NULL
을 호출하지 않고 설정됩니다.save
답변
참조 삭제에게 관련 요소를 파괴 곳 DELETE_ALL 자기 테이블에서 여러 데이터를 삭제할 수 있습니다 로DELETE * FROM table where field = 'xyz'
가능한 옵션 :
소유자가 소멸 될 때 연관된 오브젝트에 발생하는 상황을 제어합니다. 이것들은 콜백으로 구현되며 Rails는 콜백을 순서대로 실행합니다. 따라서 다른 유사한 콜백은 : 종속적 인 동작에 :dependent
영향을 줄 수 있으며이 동작은 다른 콜백에 영향을 줄 수 있습니다.
:destroy
관련된 모든 객체도 파괴됩니다.
:delete_all
연관된 모든 객체가 데이터베이스에서 직접 삭제되도록합니다 (따라서 콜백은 실행되지 않습니다).
:nullify
외래 키를 NULL로 설정합니다. 콜백이 실행되지 않습니다.
:restrict_with_exception
연관된 레코드가있는 경우 예외가 발생합니다.
:restrict_with_error
연관된 오브젝트가있는 경우 소유자에게 오류가 추가됩니다.
:through
옵션 과 함께 사용하는 경우 , 결합 모델의 연관은 belongs_to 여야하고, 삭제 된 레코드는 연관된 레코드가 아닌 결합 레코드입니다.
답변
실제로 가장 큰 차이점은 콜백 :delete_all
이 사용될 때 호출되지 않는다는 것 입니다. 그러나 :destroy
콜백 스택 ( :after_destroy
, :after_commit
…)이 사용되면 발생합니다.
따라서 touch:
모델에서 삭제되는 선언이있는 경우 dependent: :delete_all
오히려 ‘dependent : : destroy’ 를 사용하는 것이 좋습니다 .