Railsのfind_or_create_byのblockはcreateした際にしか実行されない

More than 3 years have passed since last update.

Rails4.1からあるらしいfind_or_create_byのblockについて勘違いしてた。


  • blockはfindでも実行されると思ってた

  • 実際はcreateされた際にblockは実行される

具体的に言うと次のようなコードがあるとするじゃないですか

User.find_or_create_by(first_name: 'Scarlett') do |user|

user.last_name = 'Johansson'
end

find_or_create_byはデータにあれば1件取得するか、なければ作成してくれるわけですが、このblockを使った例ではlast_nameに値を入れている。これfindして1件取得した際にもこのblockを実行しsaveしてくれるのかと勘違いしてた。

実際のRails4.2.1のコードを見てみると次のようにfind_byしてなければcreateしblockを渡してる

def find_or_create_by(attributes, &block)

find_by(attributes) || create(attributes, &block)
end

だがしかし、いまいちcreateした後にblockを実行する良さが分からない...。このblock"で"実行したい処理って何ですかね?

ちなみにfind_or_initialize_byはcreateではなくnewしてる

def find_or_initialize_by(attributes, &block)

find_by(attributes) || new(attributes, &block)
end