Ho un'associazione per un utente come user has_many agents
e agent belongs_to user
. nella console di rotaie, sto provando a utilizzare diversi utenti per testare uno scenario particolare e voglio un utente senza agenti, quindi voglio eliminare lo user.agents
. ho provato user.agents.map(&:destroy)
, ma dà errore come ActiveRecord::StaleObjectError: Attempted to delete a stale object
. Ho anche provato user.agents.delete_all
ma anche questo non funziona. Posso cancellare gli agenti utenti con un singolo comando nella console delle rotaie.Elimina console all in
risposta
È meglio utilizzare destroy
perché passa attraverso tutti i Rails magia (callback e simili)
user.destroy #For a single record
user.agents.destroy_all #For a collection
ActiveRecord::StaleObjectError
Is for Optimistic locking, rimuovere tutti i blocchi che hai su di esso prima di tentare di eliminare nuovamente. Controlla se qualcun altro sta utilizzando il sistema o invia i moduli aperti.
Si sta cercando un metodo .destroy_all
. Distrugge tutti i record di una determinata collezione. Quindi user.agents.destroy_all
, restituirebbe un array vuoto per user.agents
.
Non è stato possibile utilizzare .delete_all
perché è un metodo di classe e cancella i record che corrispondono a una determinata condizione. In questo modo, Agent.delete_all(condition)
. Se usato senza una condizione, cancella tutti i record da una tabella abbinata.
Ricordare che i metodi .destroy
sono metodi di istanza. Istanziano un oggetto ed eseguono le richiamate prima di cancellarlo. I metodi .delete
sono metodi di classe e cancellano direttamente un oggetto.
questo funziona per me
user.agents.find_each(&:destroy)
voglio distruggere 'user.agents' e ho cercato' user.agents.destroy, ma mi dà errore. –
è "user.destroy" o "user.agents.destroy_all". Primo atto su un singolo record, secondo atto su una raccolta – Benj