Überprüfen Sie, ob der Datensatz gerade in Schienen zerstört wurde


82

Also da ist

record.new_record?

Um zu überprüfen, ob etwas neu ist

Ich muss überprüfen, ob etwas auf dem Weg nach draußen ist.

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

Sowas in der Art. Ich weiß, dass das Zerstören das Objekt einfriert, also eingefroren? Art von Arbeiten, aber gibt es etwas explizit für diese Aufgabe?

Antworten:


50

Du kannst das.

Record.exists?(record)

Dies führt jedoch zu einem Treffer in der Datenbank, der nicht wirklich erforderlich ist. Die einzige andere Lösung, die ich kenne, ist ein Rückruf wie in IV erwähnt.

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

Und dann überprüfen record.destroyed.


2
Ich denke, ein gewisser Kontext ist hier hilfreich. Es hängt davon ab, warum Sie wissen möchten, ob ein Objekt zerstört wurde. Wenn Sie dies als Teil eines Komponententests tun, ist der zusätzliche Treffer für die Datenbank in Ordnung. Wenn Sie dies als Teil der App tun, ist es möglicherweise besser, die zweite Route zu wählen.
Jerhinesmith

65
Dies ist nicht mehr notwendig, verwenden Sieobject.destroyed?
Rob

2
in Rails 4 DEPRECATION WARNING: You are passing an instance of ActiveRecord::Base to existiert? . Please pass the id of the object by calling .id.
Minqi Pan

5
Muss noch Record.exists?in Controller-Spezifikationen verwendet werden, da ich zerstörte Datensätze nicht neu laden kann, um zu überprüfen, ob dies der Fall ist destroyed?. Aber wenn ich eine Instanzvariable zum Überprüfen habe assings, kann ich sie verwenden destroyed?.
denis.peplin

@ Daniel Huckstep, wenn du noch lebst, ändere bitte die akzeptierte Antwort gegen die richtige!
Daniel


10

Das kommt sehr bald. Im neuesten Riding Rails- Beitrag heißt es:

Und schließlich ist es nicht unbedingt BugMash-bezogen, aber José Valim - neben Dutzenden anderer Commits - hat model.destroyed? Hinzugefügt. Diese raffinierte Methode gibt nur dann true zurück, wenn die Instanz, die Sie gerade betrachten, erfolgreich zerstört wurde.

Hier bitteschön. Kommt bald!


6

Während record.destroyed? funktioniert einwandfrei und gibt true oder false zurück. Sie können dies auch ein wenig TROCKNEN und die if-Bedingung in der Zeile, die Sie aufrufen, in Ihrem Controller erstellen.

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

Erkenne, dass dieser Beitrag etwas spät im Spiel ist. Aber sollte jemand mehr darüber diskutieren wollen, bin ich ein Spiel! Randnotiz: Ich hatte auch eine after_destroy-Validierung für mein Modell und während es funktionierte, scheint eine separate Methode für so etwas wie ein Overkill zu sein;)


5

destroyWenn Sie ein Objekt zurückgeben, wird freeze(soweit ich weiß) nichts anderes als ein Anruf zurückgegeben. Ich denke, dies frozen?ist Ihre beste Wahl. Ihre andere Möglichkeit ist die Rettung, ActiveRecord::RecordNotFoundwenn Sie so etwas getan haben record.reload.

Ich denke, Mikes Taktik oben könnte die beste sein, oder Sie könnten einen Wrapper für diese genannten Fälle schreiben, wenn Sie anfangen möchten, Annahmen zu treffen.

Prost.


Ich überprüfe derzeit nur eingefroren?, Aber wirklich kann ich etwas laden und für einen anderen Zweck einfrieren, und es wäre dann eine Lüge ... In der aktuellen Situation eingefroren? funktioniert gut, aber ich möchte mich nicht langfristig darauf verlassen.
Daniel Huckstep

0

Ohne mehr über die Logik Ihrer App zu wissen, denke ich, dass eingefroren? ist die beste Wahl.

Andernfalls könnten Sie Ihren Modellen, die Sie in den Rückrufen auslösen, sicherlich ein "zerstörtes" Attribut hinzufügen, das überprüft werden könnte, wenn Sie eine genauere Lösung wünschen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.