Sprawdź, czy płyta została zniszczona w szynach

83

Więc tam jest

record.new_record?

Aby sprawdzić, czy coś jest nowe

Muszę sprawdzić, czy coś jest w ruchu.

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

Coś w tym stylu. Wiem, że zniszczenie zamraża obiekt, tak zamrożony? rodzaj działa, ale czy jest coś bezpośrednio do tego zadania?

Daniel Huckstep
źródło

Odpowiedzi:

50

Możesz to zrobić.

Record.exists?(record.id)

Jednak spowoduje to trafienie w bazie danych, co nie zawsze jest konieczne. Jedynym innym rozwiązaniem, które znam, jest oddzwonienie, jak wspomniano w IV.

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

A potem sprawdź record.destroyed.

ryanb
źródło
2
Myślę, że pomocny jest tutaj kontekst. Zależy to od tego, dlaczego chcesz wiedzieć, czy obiekt został zniszczony. Jeśli robisz to w ramach testu jednostkowego, dodatkowe trafienie w bazę danych jest w porządku. Jeśli robisz to w ramach aplikacji, lepszym rozwiązaniem może być wybranie drugiej ścieżki.
jerhinesmith
69
Nie jest to już konieczne, użyjobject.destroyed?
Rob
2
w Rails 4, DEPRECATION WARNING: You are passing an instance of ActiveRecord::Base to istnieje? . Please pass the id of the object by calling .id.
Minqi Pan
5
Nadal potrzebuję Record.exists?specyfikacji kontrolera, ponieważ nie mogę ponownie załadować zniszczonego rekordu, aby sprawdzić, czy tak jest destroyed?. Ale jeśli mam zmienną instancji do sprawdzenia assings, mogę użyć destroyed?.
denis.peplin
@Daniel Huckstep, jeśli nadal żyjesz, zmień zaakceptowaną odpowiedź na poprawną!
Daniel,
11

To nastąpi bardzo szybko. W najnowszym poście Riding Rails jest napisane:

I na koniec, niekoniecznie jest to związane z BugMash, ale José Valim - wśród dziesiątek innych zatwierdzeń - dodał model.destroyed ?. Ta sprytna metoda zwróci wartość true tylko wtedy, gdy instancja, na którą aktualnie patrzysz, została pomyślnie zniszczona.

A więc proszę. Wkrótce!

Steve Klabnik
źródło
6

Podczas gdy rekord został zniszczony? działa dobrze i zwraca prawdę lub fałsz, możesz również nieco WYSUSZIĆ i utworzyć warunek if w linii, którą wywołujesz w kontrolerze.

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

Uświadom sobie, że ten post jest trochę za późno w grze. Ale gdyby ktoś chciał o tym więcej dyskutować, jestem grą! Nota boczna: Miałem również walidację after_destroy na moim modelu i podczas gdy to działało, osobna metoda na coś takiego wydaje się przesadą;)

DGG
źródło
5

destroyning obiektu nie zwraca niczego poza wezwaniem do freeze(o ile wiem), więc myślę, że frozen?jest to najlepszy wybór. Inną opcją jest ratunek, ActiveRecord::RecordNotFoundjeśli zrobiłeś coś takiego record.reload.

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

Twoje zdrowie.

theIV
źródło
Aktualnie sprawdzam tylko zamrożone? Ale tak naprawdę mogę coś załadować i zamrozić w jakimś innym celu i byłoby wtedy kłamstwem ... W obecnej sytuacji zamrożone? działa dobrze, ale nie chcę na tym polegać przez dłuższy czas.
Daniel Huckstep
0

Nie wiedząc więcej o logice Twojej aplikacji, myślę, że to się zawiesiło? to najlepszy wybór.

Jeśli to się nie powiedzie, z pewnością możesz dodać atrybut „zniszczony” do swoich modeli, który wyzwalasz w wywołaniach zwrotnych i który możesz sprawdzić, jeśli chcesz uzyskać bardziej precyzyjne rozwiązanie.

Mike Buckbee
źródło