web-dev-qa-db-fra.com

Vérifiez si l'enregistrement vient d'être détruit dans rails

Il y a donc

record.new_record?

Pour vérifier si quelque chose est nouveau

Je dois vérifier si quelque chose est en train de disparaître.

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

Quelque chose comme ca. Je sais que détruire gèle l'objet, donc gelé? sorte de travaux, mais y a-t-il quelque chose explicitement pour cette tâche?

76
Daniel Huckstep

Tu peux le faire.

Record.exists?(record)

Cependant, cela fera un hit sur la base de données qui n'est pas vraiment nécessaire. La seule autre solution que je connaisse est de faire un rappel comme l'IV l'a mentionné.

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

Et puis vérifiez record.destroyed.

48
ryanb

Simplement fais-le:

record.destroyed?

Les détails sont ici ActiveRecord :: Persistence

186
Voldy

Cela arrive très bientôt. Dans le dernier Riding Rails post, il dit ceci:

Et enfin, ce n'est pas nécessairement lié à BugMash, mais José Valim - parmi des dizaines d'autres commits - a ajouté model.destroyed ?. Cette méthode astucieuse ne retournera true que si l'instance que vous regardez actuellement a été détruite avec succès.

Alors voilà. Bientôt disponible!

10
Steve Klabnik

Alors que record.destroyed? fonctionne bien et retourne vrai ou faux, vous pouvez également DRY cela un peu et créer la condition if sur la ligne que vous appelez destroy dans votre contrôleur.

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

Sachez que ce message est un peu en retard dans le match. Mais si quelqu'un veut en discuter davantage, je joue! Note latérale: J'ai également eu une validation after_destroy sur mon modèle et pendant que cela fonctionnait, une méthode distincte pour quelque chose comme ça semble exagérée;)

6
DGG

destroying un objet ne renvoie rien d'autre qu'un appel à freeze (pour autant que je sache) donc je pense que frozen? est votre meilleur choix. Votre autre option consiste à sortir de ActiveRecord::RecordNotFound si vous avez fait quelque chose comme record.reload.

Je pense que la tactique de Mike ci-dessus pourrait être la meilleure, ou vous pouvez écrire un wrapper pour ces cas mentionnés si vous voulez commencer à "faire des hypothèses".

À votre santé.

5
theIV

Sans en savoir plus sur la logique de votre application, je pense que c'est figé? est votre meilleur pari.

A défaut, vous pourriez certainement ajouter à vos modèles un attribut "détruit" que vous déclenchez dans les rappels et qui pourrait être vérifié si vous souhaitez une solution plus précise.

0
Mike Buckbee