Rails Find_or_Create_by où le bloc fonctionne dans le cas de la recherche?
-
13-11-2019 - |
Question
La méthode Actionecord Find_or_Create_By Dynamic Finder me permet de spécifier un bloc.La documentation n'est pas claire à ce sujet, mais il semble que le bloc ne fonctionne que dans le cas Create, et non dans le cas de la recherche.En d'autres termes, si l'enregistrement est trouvé, le bloc ne fonctionne pas.Je l'ai testé avec ce code de console:
User.find_or_create_by_name("An Existing Name") do |u|
puts "I'M IN THE BLOCK"
end
(rien n'a été imprimé).Y a-t-il un moyen de faire fonctionner le bloc dans les deux cas?
La solution
Autant que je comprenne, le bloc sera exécuté si rien ne se trouve.Upease de celui-ci ressemble à ceci:
User.find_or_create_by_name("Pedro") do |u|
u.money = 0
u.country = "Mexico"
puts "User is created"
end
Si l'utilisateur n'a pas été trouvé, il n'a pas initialisé le nouvel utilisateur avec nom "Pedro" et tout ce truc dans le bloc et retournera nouvel utilisateur créé.Si l'utilisateur existe, il renvoie simplement cet utilisateur sans exécuter le bloc.
Aussi vous pouvez utiliser "style de bloc" d'autres méthodes telles que:
User.create do |u|
u.name = "Pedro"
u.money = 1000
end
Il fera la même chose que User.create( :name => "Pedro", :money => 1000 )
, mais semble un peu plus agréable
et
User.find(19) do |u|
..
end
etc
Autres conseils
Il ne me semble pas que cette question soit réellement répondue, alors je le ferai.C'est le moyen le plus simple, je pense que vous pouvez y parvenir:
User.find_or_create_by_name("An Existing Name or Non Existing Name").tap do |u|
puts "I'M IN THE BLOCK REGARDLESS OF THE NAME'S EXISTENCE"
end
acclamations!