Skip to content

Commit 502f044

Browse files
authored
Merge pull request rails#47836 from Shopify/pm/cpk-relation-handler
Only default to select primary key when non-composite
2 parents bcd19d9 + e0e89b1 commit 502f044

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

activerecord/lib/active_record/relation/predicate_builder/relation_handler.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ def call(attribute, value)
99
end
1010

1111
if value.select_values.empty?
12-
value = value.select(value.table[value.klass.primary_key])
12+
if value.klass.composite_primary_key?
13+
raise ArgumentError, "Cannot map composite primary key #{value.klass.primary_key} to #{attribute.name}"
14+
else
15+
value = value.select(value.table[value.klass.primary_key])
16+
end
1317
end
1418

1519
attribute.in(value.arel)

activerecord/test/cases/relations_test.rb

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,10 @@
2727
require "models/categorization"
2828
require "models/edge"
2929
require "models/subscriber"
30+
require "models/cpk"
3031

3132
class RelationTest < ActiveRecord::TestCase
32-
fixtures :authors, :author_addresses, :topics, :entrants, :developers, :people, :companies, :developers_projects, :accounts, :categories, :categorizations, :categories_posts, :posts, :comments, :tags, :taggings, :cars, :minivans
33+
fixtures :authors, :author_addresses, :topics, :entrants, :developers, :people, :companies, :developers_projects, :accounts, :categories, :categorizations, :categories_posts, :posts, :comments, :tags, :taggings, :cars, :minivans, :cpk_orders
3334

3435
def test_do_not_double_quote_string_id
3536
van = Minivan.last
@@ -945,6 +946,21 @@ def test_find_all_using_where_with_relation_and_alternate_primary_key
945946
}
946947
end
947948

949+
def test_find_all_using_where_with_relation_with_no_selects_and_composite_primary_key_raises
950+
order = cpk_orders(:cpk_groceries_order_1)
951+
subquery = Cpk::Order.where(Cpk::Order.primary_key => [order.id])
952+
953+
assert_nothing_raised do
954+
Cpk::Order.where(id: subquery.select(:id)).to_a
955+
end
956+
957+
error = assert_raise(ArgumentError) do
958+
Cpk::Order.where(id: subquery).to_a
959+
end
960+
961+
assert_equal "Cannot map composite primary key [\"shop_id\", \"id\"] to id", error.message
962+
end
963+
948964
def test_find_all_using_where_with_relation_does_not_alter_select_values
949965
david = authors(:david)
950966

0 commit comments

Comments
 (0)