2009-08-18 4 views
64

Więc nie maSprawdź, czy rekord został tylko zniszczony w szynach

record.new_record? 

Aby sprawdzić, czy coś jest nowe

muszę sprawdzić, czy coś jest na to wyjście.

record = some_magic 
record.destroy 
record.is_destroyed? # => true 

Coś w tym stylu. Wiem, że zniszczenie powoduje zamrożenie obiektu, tak zamrożone? rodzaj prac, ale czy jest coś jawnie do tego zadania?

Odpowiedz

40

Możesz to zrobić.

Record.exists?(record) 

Jednak spowoduje to trafienie w bazę danych, która nie jest konieczna. Jedynym innym rozwiązaniem, jakie znam, jest wykonanie wywołania zwrotnego, o którym wspomniałem.

attr_accessor :destroyed 
after_destroy :mark_as_destroyed 
def mark_as_destroyed 
    self.destroyed = true 
end 

A następnie sprawdź record.destroyed.

+2

Myślę, że pewien kontekst jest tutaj pomocny. To zależy od tego, dlaczego chcesz wiedzieć, czy obiekt został zniszczony. Jeśli robisz to w ramach testu jednostkowego, dodatkowe trafienie w bazie danych jest w porządku. Jeśli robisz to jako część aplikacji, wtedy druga trasa może być lepsza. – jerhinesmith

+49

To nie jest już konieczne, użyj 'object.destroyed?' – Rob

+0

http://stackoverflow.com/a/3462595/850996 jest poprawną odpowiedzią –

0

Nie wiedząc więcej o logice aplikacji, myślę, że zamrożone? to twój najlepszy zakład.

Jeśli to się nie powiedzie, z pewnością można dodać atrybut "zniszczony" do modeli uruchamianych w ramach wywołań zwrotnych, które można sprawdzić w celu uzyskania bardziej precyzyjnego rozwiązania.

4

destroy ing obiekt robi nic innego nie powrócić niż wywołanie freeze (o ile wiem) więc myślę frozen? jest najlepszym. Inną opcją jest uratowanie od ActiveRecord::RecordNotFound, jeśli zrobiłeś coś takiego jak record.reload.

Myślę, że taktyka Mike'a powyżej może być najlepsza, lub możesz napisać opakowanie dla tych przypadków, jeśli chcesz zacząć "przyjmować założenia".

Pozdrawiam.

+0

Obecnie tylko sprawdzam zamrożone ?, ale naprawdę mogę załadować coś i zamrozić je dla jakiś inny cel i byłoby to kłamstwo wtedy ... W obecnej sytuacji zamrożone? działa dobrze, ale nie chcę na nim polegać długoterminowo. –

10

To już wkrótce. W najnowszym Riding Rails postu, to mówi tak:

I wreszcie, to nie koniecznie BugMash związane, ale José Valim - wśród dziesiątek innych zatwierdzeń - dodał model.destroyed ?. Ta sprytna metoda zwróci true tylko wtedy, gdy aktualnie oglądana instancja zostanie pomyślnie zniszczona.

Więc proszę bardzo. Wkrótce!

166

Wystarczy zrobić:

record.destroyed? 

Szczegóły tutaj ActiveRecord::Persistence

+0

Jest częścią modułu ActiveRecord :: Persistence: http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html –

+0

@Kevin: Dzięki! Zaktualizowałem moją odpowiedź. Wszystko zmienia się wraz z upływem czasu :) – Voldy

4

Podczas record.destroyed? działa dobrze, i zwraca wartość true lub false, możesz również DRY to trochę i stworzyć warunek if na linii, którą wywołujesz niszcząc w swoim kontrolerze.

record = Object.find(params[:id]) 
if record.destroy 
    ... happy path 
else 
    ... sad path 
end 

Uświadomiłem sobie, że ten post jest nieco spóźniony.Ale jeśli ktoś chce dyskutować o tym więcej, jestem gra! Notatka boczna: Miałem również walidację po_destroy na moim modelu i podczas pracy, osobna metoda na coś podobnego wydaje się przesadą;)