module NxtSupport::SafelyFindOrCreateable::ClassMethods

Public Instance Methods

safely_find_or_create_by(attributes, &block) click to toggle source
# File lib/nxt_support/models/safely_find_or_createable.rb, line 6
def safely_find_or_create_by(attributes, &block)
  transaction(requires_new: true) { create(attributes, &block) }
rescue ActiveRecord::RecordNotUnique
  find_by(attributes)
end
safely_find_or_create_by!(attributes, &block) click to toggle source
# File lib/nxt_support/models/safely_find_or_createable.rb, line 12
def safely_find_or_create_by!(attributes, &block)
  transaction(requires_new: true) { create!(attributes, &block) }
rescue ActiveRecord::RecordNotUnique
  find_by!(attributes)
rescue ActiveRecord::RecordInvalid => e
  all_errors_are_uniqueness_failures = e.record.errors.details.all? { |_key, errs| errs.all? { |err| err[:error] == :taken } }
  raise unless all_errors_are_uniqueness_failures
  find_by!(attributes)
end