From 0daf81f69ac61f94a46300b5fc7c0b691592d12b Mon Sep 17 00:00:00 2001 From: Bastian Bartmann Date: Sat, 6 Mar 2021 13:27:48 +0100 Subject: [PATCH] upsert_all fails cleanly for MySQL --- activerecord/lib/active_record/insert_all.rb | 6 +++++- activerecord/test/cases/insert_all_test.rb | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/insert_all.rb b/activerecord/lib/active_record/insert_all.rb index 78c81f52cc..8f6231a5fa 100644 --- a/activerecord/lib/active_record/insert_all.rb +++ b/activerecord/lib/active_record/insert_all.rb @@ -77,7 +77,11 @@ def map_key_with_value attr_reader :scope_attributes def find_unique_index_for(unique_by) - return unique_by if !connection.supports_insert_conflict_target? + if !connection.supports_insert_conflict_target? + return if unique_by.nil? + + raise ArgumentError, "#{connection.class} does not support :unique_by" + end name_or_columns = unique_by || model.primary_key match = Array(name_or_columns).map(&:to_s) diff --git a/activerecord/test/cases/insert_all_test.rb b/activerecord/test/cases/insert_all_test.rb index 902f0157e3..635861aee7 100644 --- a/activerecord/test/cases/insert_all_test.rb +++ b/activerecord/test/cases/insert_all_test.rb @@ -486,6 +486,15 @@ def test_upsert_all_updates_using_provided_sql assert_equal "written", Book.find(2).status end + def test_upsert_all_with_unique_by_fails_cleanly_for_adapters_not_supporting_insert_conflict_target + skip if supports_insert_conflict_target? + + error = assert_raises ArgumentError do + Book.upsert_all [{ name: "Rework", author_id: 1 }], unique_by: :isbn + end + assert_match "#{ActiveRecord::Base.connection.class} does not support :unique_by", error.message + end + private def capture_log_output output = StringIO.new