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?

Était-ce utile?

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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top