2013-07-19 15 views
8

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

18

È 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 
+0

voglio distruggere 'user.agents' e ho cercato' user.agents.destroy, ma mi dà errore. –

+1

è "user.destroy" o "user.agents.destroy_all". Primo atto su un singolo record, secondo atto su una raccolta – Benj

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

5

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.

1

questo funziona per me

user.agents.find_each(&:destroy)