104 votes

Comment faire pour déterminer si un enregistrement est juste créé ou mis à jour dans after_save

Le #new_record? la fonction détermine si un enregistrement a été enregistré. Mais il est toujours faux dans after_save crochet. Est-il un moyen pour déterminer si l'enregistrement est un enregistrement récemment créé ou un ancien de mise à jour?

Je suis l'espoir de ne pas utiliser un autre rappel comme before_create de définir un indicateur dans le modèle ou le besoin d'une autre requête dans la base.

Tout conseil est le bienvenue.

Edit: Besoin de le déterminer à after_save crochet, et pour mon cas d'utilisation particulier, il n'y a pas de updated_at ou updated_on timestamp

183voto

Zubin Points 3130

Je cherchais à utiliser pour un after_save de rappel. Une solution plus simple est d'utiliser id_changed? (car il ne changera pas sur la mise à jour) ou même created_at_changed? si les colonnes timestamp sont présents.

32voto

Jeff Paquette Points 5512

Aucun rails de la magie ici, que je sache, vous devrez le faire vous-même. Vous pourriez nettoyer à l'aide d'un champ virtuel...

Dans votre classe de modèle:

def before_save
  @was_a_new_record = new_record?
  return true
end

def after_save
  if @was_a_new_record
    ...
  end
end

30voto

colllin Points 1705

Encore une autre option, pour ceux qui ne l'ont un updated_at timestamp:

if created_at == updated_at
  # it's a newly created record
end

22voto

sharpone Points 196

Il y a un after_create de callback qui est appelée uniquement si l'enregistrement est un nouveau record, après il est enregistré. Il y a aussi un after_update de rappel pour l'utiliser si c'était un enregistrement existant qui a été modifiée et enregistrée. L' after_save callback est appelée dans les deux cas, après after_create ou after_update est appelé.

Utiliser after_create si vous besoin de quelque chose à se produire une fois après un nouveau record a été enregistré.

Plus d'infos ici: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

18voto

Tom Rossi Points 1525

Puisque l'objet a déjà été enregistré, vous auriez-vous besoin de regarder les changements précédents. L'ID doit seulement changer après un créer.

@object.previous_changes[:id] # either nil or an array of changes

Il y a aussi une variable d'instance, @new_record_before_save. Vous pouvez accéder qu'en procédant de la manière suivante:

@object.instance_variable_get(:@new_record_before_save) # true or false

Les deux sont assez moches, mais ils vous permettent de savoir si l'objet a été créé ou mis à jour. Espérons que ça aide!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X