태그 보관물: ruby-on-rails

ruby-on-rails

레일 : dependent => : destroy VS : dependent => : delete_all :destroy경우 삭제됩니다.:dependent => :delete_all 맞아요

레일 가이드에서 다음과 같이 설명됩니다.

에 연결된 경우 객체가 추가로 삭제되고 연결된 :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’ 를 사용하는 것이 좋습니다 .


답변