1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Move sequence value methods to Model level

`prefetch_primary_key?` and `next_sequence_value` methods live in the
connection level at the moment, that make sense when you are generating
the sequence from the database, in the same connection. Which is the use
case today at the Oracle and Postgres adapters.
However if you have an service that generates IDs, that has nothing to
do with the database connection, and should not be fetched from there.
Another use case, is if you want to use another connection to fetch IDs,
that would not be possible with the current implementation, however when
we move those methods to the model level, you can use a new connection
there.

Also this makes easier for gems to add behavior on those methods.
This commit is contained in:
Arthur Neves 2016-03-23 18:50:11 -04:00
parent fbe6e4e306
commit b6d1f68412
No known key found for this signature in database
GPG key ID: 04A390FB1E433E17
2 changed files with 14 additions and 2 deletions

View file

@ -231,6 +231,18 @@ module ActiveRecord
@explicit_sequence_name = true
end
# Determines if the primary key values should be selected from their
# corresponding sequence before the insert statement.
def prefetch_primary_key?
connection.prefetch_primary_key?(table_name)
end
# Returns the next value that will be used as the primary key on
# an insert statment.
def next_sequence_value
connection.next_sequence_value(sequence_name)
end
# Indicates whether the table associated with this class exists
def table_exists?
connection.schema_cache.data_source_exists?(table_name)

View file

@ -45,8 +45,8 @@ module ActiveRecord
k.name == primary_key
}]
if !primary_key_value && connection.prefetch_primary_key?(klass.table_name)
primary_key_value = connection.next_sequence_value(klass.sequence_name)
if !primary_key_value && klass.prefetch_primary_key?
primary_key_value = klass.next_sequence_value
values[arel_attribute(klass.primary_key)] = primary_key_value
end
end