これ何
create_or_find_by
と find_or_create_by
の違いってなんだろうって深夜に思ったのでまとめました。
まとめ
簡単にまとめると、createが先に実行されるかfindが先に実行されるかです。
create_or_find_by
transactionに失敗したらfind_byする。
def create_or_find_by(attributes, &block)
transaction(requires_new: true) { create(attributes, &block) }
rescue ActiveRecord::RecordNotUnique
find_by!(attributes)
end
違いについて
find_or_create_by でできないカラムもcreate_or_find_byではできてしまう可能性があります。
例えば、Userモデルがあったとします。create_or_find_by
ではcreateが先に実行されるため2つ同じようなデータが作られます。
find_or_create_byでは、findが先に実行されるため、検索結果が返され、同じデータは2つ作られることはありません。
User.create_or_find_by({name: 'geru')
User.create_or_find_by({name: 'geru')
User.count
# => 2
User.find_or_create_by({name: 'geru')
User.find_or_create_by({name: 'geru')
User.count
# => 1