upsert_all fails cleanly for MySQL

This commit is contained in:
Bastian Bartmann 2021-03-06 13:27:48 +01:00
parent 2bbb519482
commit 0daf81f69a
2 changed files with 14 additions and 1 deletions

@ -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)

@ -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