Skip to content

Commit ed5af00

Browse files
authored
Merge pull request rails#48998 from Shopify/to_key-supports-composite-primary-key
Support composite identifiers in `to_key`
2 parents 3338621 + 8a5cf4c commit ed5af00

File tree

6 files changed

+28
-2
lines changed

6 files changed

+28
-2
lines changed

actionview/test/lib/controller/fake_models.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,3 +217,13 @@ def save
217217
@to_key = [1]
218218
end
219219
end
220+
221+
class CompositePrimaryKeyRecord
222+
extend ActiveModel::Naming
223+
include ActiveModel::Conversion
224+
attr_reader :id
225+
226+
def initialize(id)
227+
@id = id
228+
end
229+
end

actionview/test/template/record_identifier_test.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ def test_dom_id_with_saved_record
3030
assert_equal "#{@singular}_1", dom_id(@record)
3131
end
3232

33+
def test_dom_id_with_composite_primary_key_record
34+
record = CompositePrimaryKeyRecord.new([1, 123])
35+
assert_equal("composite_primary_key_record_1_123", dom_id(record))
36+
end
37+
3338
def test_dom_id_with_prefix
3439
@record.save
3540
assert_equal "edit_#{@singular}_1", dom_id(@record, :edit)

activemodel/lib/active_model/conversion.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def to_model
5858
# person.to_key # => [1]
5959
def to_key
6060
key = respond_to?(:id) && id
61-
key ? [key] : nil
61+
key ? Array(key) : nil
6262
end
6363

6464
# Returns a +string+ representing the object's key suitable for use in URLs,

activemodel/test/cases/conversion_test.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ class ConversionTest < ActiveModel::TestCase
1818
assert_equal [1], Contact.new(id: 1).to_key
1919
end
2020

21+
test "to_key doesn't double-wrap composite `id`s" do
22+
assert_equal ["abc", "xyz"], Contact.new(id: ["abc", "xyz"]).to_key
23+
end
24+
2125
test "to_param default implementation returns nil for new records" do
2226
assert_nil Contact.new.to_param
2327
end

activerecord/lib/active_record/attribute_methods/primary_key.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ module PrimaryKey
1212
# available.
1313
def to_key
1414
key = id
15-
[key] if key
15+
Array(key) if key
1616
end
1717

1818
# Returns the primary key column's value.

activerecord/test/cases/primary_keys_test.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ def test_to_key_with_customized_primary_key
2929
assert_equal keyboard.to_key, [keyboard.id]
3030
end
3131

32+
def test_to_key_with_composite_primary_key
33+
order = Cpk::Order.new
34+
assert_equal [nil, nil], order.to_key
35+
order.id = [1, 2]
36+
assert_equal [1, 2], order.to_key
37+
end
38+
3239
def test_read_attribute_with_custom_primary_key
3340
keyboard = Keyboard.create!
3441
assert_equal keyboard.key_number, keyboard.read_attribute(:id)

0 commit comments

Comments
 (0)