module ActiveRecord::Core::ClassMethods

def find_by(*args) # :nodoc:

:nodoc:
def find_by(*args) # :nodoc:
  return super if scope_attributes?
  hash = args.first
  return super unless Hash === hash
  hash = hash.each_with_object({}) do |(key, value), h|
    key = key.to_s
    key = attribute_aliases[key] || key
    return super if reflect_on_aggregation(key)
    reflection = _reflect_on_association(key)
    if !reflection
      value = value.id if value.respond_to?(:id)
    elsif reflection.belongs_to? && !reflection.polymorphic?
      key = reflection.join_foreign_key
      pkey = reflection.join_primary_key
      value = value.public_send(pkey) if value.respond_to?(pkey)
    end
    if !columns_hash.key?(key) || StatementCache.unsupported_value?(value)
      return super
    end
    h[key] = value
  end
  keys = hash.keys
  statement = cached_find_by_statement(keys) { |params|
    wheres = keys.index_with { params.bind }
    where(wheres).limit(1)
  }
  begin
    statement.execute(hash.values, connection).first
  rescue TypeError
    raise ActiveRecord::StatementInvalid
  end
end