なんとブロックに渡せば書ける。簡単。
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