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
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
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.
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.
Działa to dla mnie
user.agents.find_each(&:destroy)
chcę zniszczyć 'user.agents' i starałem' user.agents.destroy, ale daje mi błąd. –
to 'user.destroy' albo' user.agents.destroy_all'. Najpierw jeden akt na jednej płycie, drugi akt w kolekcji – Benj