find_or_create_by で create の時のみ実行される処理を書きたい

なんとブロックに渡せば書ける。簡単。

User.find_or_create_by(email: "[email protected]") do |u| u.password = generate_initial_password end

実装を見に行くと find_by には attributes のみ渡し、 create には attributes と block を渡している。

def find_or_create_by(attributes, &block) find_by(attributes) || create(attributes, &block) end
https://github.com/rails/rails/blob/984c3ef2775781d47efa9f541ce570daa2434a80/activerecord/lib/active_record/relation.rb#L168

参考