Module: ActiveRecord::Returning

Defined in:
lib/activerecord/returning.rb,
lib/activerecord/returning/errors.rb,
lib/activerecord/returning/version.rb,
lib/activerecord/returning/querying.rb,
lib/activerecord/returning/statement.rb,
lib/activerecord/returning/relation_methods.rb

Overview

UPDATE ... RETURNING and DELETE ... RETURNING for ActiveRecord::Relation.

Defined Under Namespace

Modules: Querying, RelationMethods Classes: Error, Statement, UnsupportedAdapter

Constant Summary collapse

VERSION =
"0.1.0"

Class Method Summary collapse

Class Method Details

.supported?(connection) ⇒ Boolean

Can this connection run UPDATE/DELETE ... RETURNING?

supports_update_returning? is the precise question, but it only exists on newer Rails. supports_insert_returning? is the closest stand-in, with one trap: MariaDB answers true to it (it has INSERT ... RETURNING since 10.5) while having no UPDATE ... RETURNING at all, so the MySQL family is ruled out explicitly.

The SQLite branch is for Rails 7.0, whose SQLite3 adapter predates the capability methods even though the database itself supports RETURNING. Version compares itself to a version string by parts; a plain string compare would read "3.4.0" as newer than "3.35.0".

Returns:

  • (Boolean)


25
26
27
28
29
30
31
32
33
# File 'lib/activerecord/returning.rb', line 25

def self.supported?(connection)
  return connection.supports_update_returning? if connection.respond_to?(:supports_update_returning?)

  adapter = connection.adapter_name.to_s
  return false if adapter.match?(/mysql|trilogy|mariadb/i)
  return true if connection.supports_insert_returning?

  adapter.match?(/sqlite/i) && connection.database_version >= "3.35.0"
end