Ü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?

Daniel Huckstep
quelle

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.

Ryanb
quelle
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!

Steve Klabnik
quelle
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;)

DGG
quelle
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.

theIV
quelle
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.

Mike Buckbee
quelle