54 votes

Rails ActiveRecord : Comment savoir si find_or_create_by a été trouvé ou créé ?

Si je fais

 widget = Widget.find_or_create_by_widgetid(:widgetid => "12345", :param2 => "folk") 

etc. alors comment savoir si newobj est un widget trouvé ou nouvellement créé ? Y a-t-il quelque chose que je peux tester conditionnellement sur widget qui me le dira ?

60voto

Shadwell Points 14102

Je ne crois pas qu'il existe un moyen de savoir si l'objet est nouvellement créé ou s'il était déjà là. Vous pouvez utiliser find_or_initialize_by_widgetid place, ce qui n'enregistre pas le nouvel objet. Vous pouvez alors cocher widget.new_record? qui vous indiquera si l'objet a été enregistré ou non. Vous devriez mettre un appel de sauvegarde dans le bloc de code pour un nouvel objet, mais comme vous voulez faire cette vérification de toute façon, cela ne devrait pas gâcher le flux du code.

Donc:

 widget = find_or_initialize_by_widgetid(:widgetid => "12345", :param2 => "folk")
if widget.new_record?
  widget.save!
  # Code for a new widget
else
  # Code for an existing widget
end

37voto

fwuensche Points 923

Rails 4+

find_or_create_by(attributs, &block)

Maintenant, cette méthode accepte un bloc, qui est transmis pour créer, donc j'irais avec:

 widget = Widget.find_or_create_by(:widgetid => "12345", :param2 => "folk") do |w|
  # if you got in here, this is a new widget
end

Une autre façon de le faire dans Rails 4+ serait :

 widget = Widget.where(:widgetid => "12345", :param2 => "folk").first_or_initialize

if widget.new_record?
  # this is a new widget
end

-3voto

Tim Scott Points 7043

Selon ce que vous voulez faire, vous pouvez utiliser un bloc :

 widget = find_or_create_by(widgetid: "12345") do |widget|
  widget.param2 = "folk"
  if widget.new_record?
    # Code for a new widget.
  else
    # Code for an existing widget.
  end
end

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