ruby-on-rails ruby - Rails:dependent=>:destroy VS:dependent=>:delete_all




activerecord models (5)

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.


Answers

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'.


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.


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.


Nell'associazione di modelli di Rails è possibile specificare l'opzione :dependent , che può assumere una delle seguenti tre forme:

  • :destroy/:destroy_all Gli oggetti associati vengono distrutti accanto a questo oggetto 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

Avrei secondo le risposte di cui sopra. Inoltre per create , non si può passare false come argomento che si può fare con il save . Passare false come argomento salterà tutte le convalide dei binari





ruby-on-rails ruby model associations