2013-07-19 16 views
8

Mam powiązanie dla użytkownika pod numerem user has_many agents i agent belongs_to user. w konsoli szyn, próbuję użyć różnych użytkowników do testowania określonego scenariusza i chcę użytkownika bez agentów, dlatego chcę usunąć user.agents. Próbowałem user.agents.map(&:destroy), ale daje błąd jako ActiveRecord::StaleObjectError: Attempted to delete a stale object .i próbował nawet user.agents.delete_all, ale też nie działa. Można usunąć agentów użytkowników za pomocą jednego polecenia w konsoli szyn.Usuń wszystkie w konsoli szyn

Odpowiedz

18

Lepiej używać destroy ponieważ przechodzi przez całą magię poręcze (wywołania zwrotne i tak)

user.destroy #For a single record 
user.agents.destroy_all #For a collection 
+0

chcę zniszczyć 'user.agents' i starałem' user.agents.destroy, ale daje mi błąd. –

+1

to 'user.destroy' albo' user.agents.destroy_all'. Najpierw jeden akt na jednej płycie, drugi akt w kolekcji – Benj

0
ActiveRecord::StaleObjectError 

jest dla Optimistic locking, usuń wszystkie zamki masz na niego przed ponowną próbą usunięcia. Sprawdź, czy ktoś inny używa systemu lub prześlij otwarte formularze.

5

Szukasz metody .destroy_all. Niszczy wszystkie zapisy danej kolekcji. Tak więc user.agents.destroy_all, zwróci pustą tablicę dla user.agents.

Nie można było użyć .delete_all, ponieważ jest to metoda klasy i usuwa rekordy odpowiadające danemu warunkowi. W ten sposób, Agent.delete_all(condition). Jeśli jest używany bez warunku, usuwa wszystkie rekordy z dopasowanej tabeli.

Należy pamiętać, że metody .destroy są instancjami. Tworzą instancję obiektu i wykonują wywołania zwrotne przed skasowaniem. .delete metody są metodami klasy i bezpośrednio usuwają obiekt.

1

Działa to dla mnie

user.agents.find_each(&:destroy)