Rails find_or_create_by, где блок работает в случае поиска? - PullRequest
13 голосов
/ 28 марта 2011

Метод динамического поиска ActiveRecord find_or_create_by позволяет мне указать блок. Документация по этому вопросу не ясна, но кажется, что блок выполняется только в случае создания, а не в случае поиска. Другими словами, если запись найдена, блок не запускается. Я проверил это с помощью этого кода консоли:

User.find_or_create_by_name("An Existing Name") do |u|
  puts "I'M IN THE BLOCK"
end

(ничего не было напечатано). Есть ли способ запустить блок в обоих случаях?

Ответы [ 2 ]

23 голосов
/ 28 марта 2011

Насколько я понимаю, блок будет выполнен, если ничего не найдено. Вариант использования выглядит так:

User.find_or_create_by_name("Pedro") do |u|
  u.money = 0
  u.country = "Mexico"
  puts "User is created"
end

Если пользователь не найден, он инициализирует нового пользователя с именем "Pedro" и все эти вещи внутри блока и возвращает нового созданного пользователя. Если пользователь существует, он просто вернет этого пользователя, не выполняя блок.

Также вы можете использовать «блочный стиль» другими методами, такими как:

User.create do |u|
  u.name = "Pedro"
  u.money = 1000
end

Это будет так же, как User.create( :name => "Pedro", :money => 1000 ), но выглядит немного лучше

и

User.find(19) do |u|
  ..
end

и т.д.

10 голосов
/ 12 марта 2014

Мне не кажется, что на этот вопрос действительно дан ответ, так что я буду. Это самый простой способ, я думаю, вы можете достичь этого:

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

Ура! * * 1004

...