Rails: dependent =>: destroy VS: dependent =>: delete_all

Nelle guide delle guide è descritto in questo modo:

Gli oggetti saranno inoltre distrutti se sono associati a :dependent => :destroy e cancellati se sono associati a :dependent => :delete_all

Giusto, fico Ma qual è la differenza tra l’essere distrutto e l’essere cancellato? Ho provato entrambi e sembra fare la stessa cosa.

La differenza è con il callback.

Il :delete_all viene creato direttamente nell’applicazione e viene eliminato da SQL:

 DELETE * FROM users where compagny_id = XXXX 

Con :destroy , c’è un’istanza di tutti i tuoi figli. Quindi, se non puoi distruggerlo o se ognuno ha il suo :dependent , i suoi callback possono essere chiamati.

Nell’associazione di modelli di Rails è ansible specificare l’opzione :dependent , che può assumere una delle seguenti tre forms:

  • :destroy/:destroy_all Gli oggetti associati vengono distrutti accanto a questo object chiamando il loro metodo destroy
  • :delete/:delete_all Tutti gli oggetti associati vengono distrutti immediatamente senza chiamare il metodo :destroy
  • :nullify Le chiavi esterne di tutti gli oggetti associati sono impostate su NULL senza chiamare le loro richiamate di save

Vedi destroy cancella i suoi elementi associati dove delete_all può cancellare più dati dalla tabella autonoma come DELETE * FROM table where field = 'xyz'

: Opzioni possibili dipendenti:

Controlla cosa succede agli oggetti associati quando il loro proprietario viene distrutto. Si noti che questi sono implementati come callback e Rails esegue i callback in ordine. Pertanto, altri callback simili possono influire sul comportamento dipendente e il comportamento :dependent può influire su altri callback.

:destroy fa sì che anche tutti gli oggetti associati vengano distrutti.

:delete_all fa sì che tutti gli oggetti associati vengano eliminati direttamente dal database (quindi i callback non saranno eseguiti).

:nullify fa sì che le chiavi esterne siano impostate su NULL. Le callback non vengono eseguite.

:restrict_with_exception fa sorgere un’eccezione se ci sono dei record associati.

:restrict_with_error causa l’aggiunta di un errore al proprietario se sono presenti oggetti associati.

Se si utilizza con l’opzione :through , l’associazione sul modello di join deve essere un belongs_to e i record che vengono eliminati sono i record di join, anziché i record associati.

In realtà, la differenza principale è che eventuali callback non verranno invocati quando :delete_all stato utilizzato. Ma se usato :destroy lo stack di callback ( :after_destroy :after_commit …) verrà :after_commit .

Di conseguenza, se si ha il touch: si cancellano le dichiarazioni nei modelli eliminati, allora è meglio usare dependent: :delete_all piuttosto ‘dependent:: destroy’.