diff --git a/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb b/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb index efad7bf54d17b..521fa21a3ff30 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb @@ -189,8 +189,10 @@ def explain(arel, binds = [], options = []) # :nodoc: def insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [], returning: nil) sql, binds = to_sql_and_binds(arel, binds) value = exec_insert(sql, name, binds, pk, sequence_name, returning: returning) - return id_value if id_value - returning.nil? ? last_inserted_id(value) : returning_column_values(value) + + return returning_column_values(value) unless returning.nil? + + id_value || last_inserted_id(value) end alias create insert diff --git a/activerecord/test/cases/persistence_test.rb b/activerecord/test/cases/persistence_test.rb index 5f6ac90386526..14b1148546168 100644 --- a/activerecord/test/cases/persistence_test.rb +++ b/activerecord/test/cases/persistence_test.rb @@ -24,6 +24,7 @@ require "models/cpk" require "models/chat_message" require "models/default" +require "models/post_with_prefetched_pk" class PersistenceTest < ActiveRecord::TestCase fixtures :topics, :companies, :developers, :accounts, :minimalistics, :authors, :author_addresses, @@ -504,6 +505,11 @@ def test_create assert_equal("New Topic", topic_reloaded.title) end + def test_create_prefetched_pk + post = PostWithPrefetchedPk.create!(title: "New Message", body: "New Body") + assert_equal 123456, post.id + end + def test_create_model_with_uuid_pk_populates_id message = ChatMessage.create(content: "New Message") assert_not_nil message.id diff --git a/activerecord/test/models/post_with_prefetched_pk.rb b/activerecord/test/models/post_with_prefetched_pk.rb new file mode 100644 index 0000000000000..0c6c49283b495 --- /dev/null +++ b/activerecord/test/models/post_with_prefetched_pk.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class PostWithPrefetchedPk < ActiveRecord::Base + self.table_name = "posts" + + class << self + def prefetch_primary_key? + true + end + + def next_sequence_value + 123456 + end + end +end