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