File tree Expand file tree Collapse file tree 3 files changed +37
-5
lines changed
lib/active_record/fixture_set Expand file tree Collapse file tree 3 files changed +37
-5
lines changed Original file line number Diff line number Diff line change @@ -87,7 +87,7 @@ def fill_row_model_attributes
87
87
return unless model_class
88
88
fill_timestamps
89
89
interpolate_label
90
- generate_primary_key
90
+ model_class . composite_primary_key? ? generate_composite_primary_key : generate_primary_key
91
91
resolve_enums
92
92
resolve_sti_reflections
93
93
end
@@ -117,14 +117,28 @@ def interpolate_label
117
117
end
118
118
119
119
def generate_primary_key
120
- # generate a primary key if necessary
121
- Array ( model_metadata . primary_key_name ) . each do |pk |
122
- next if !model_metadata . has_column? ( pk ) || @row . include? ( pk )
120
+ pk = model_metadata . primary_key_name
123
121
122
+ unless column_defined? ( pk )
124
123
@row [ pk ] = ActiveRecord ::FixtureSet . identify ( @label , model_metadata . column_type ( pk ) )
125
124
end
126
125
end
127
126
127
+ def generate_composite_primary_key
128
+ id = ActiveRecord ::FixtureSet . identify ( @label )
129
+ model_metadata . primary_key_name . each_with_index do |column , index |
130
+ next if column_defined? ( column )
131
+ raise "Automatic key generation assumes columns of type Integer." unless model_metadata . column_type ( column ) == :integer
132
+
133
+ # Shift label identifier index-#-of-times to differentiate sub-components in deterministic manner.
134
+ @row [ column ] = ( id << index ) % ActiveRecord ::FixtureSet ::MAX_ID
135
+ end
136
+ end
137
+
138
+ def column_defined? ( col )
139
+ !model_metadata . has_column? ( col ) || @row . include? ( col )
140
+ end
141
+
128
142
def resolve_enums
129
143
reflection_class . defined_enums . each do |name , values |
130
144
if @row . include? ( name )
Original file line number Diff line number Diff line change @@ -1643,13 +1643,26 @@ def readonly_config
1643
1643
end
1644
1644
1645
1645
class CompositePkFixturesTest < ActiveRecord ::TestCase
1646
- fixtures :cpk_orders , :cpk_books
1646
+ fixtures :cpk_orders , :cpk_books , :authors
1647
+
1648
+ def test_generates_composite_primary_key_for_partially_filled_fixtures
1649
+ david = authors ( :david )
1650
+ david_cpk_book = cpk_books ( :cpk_known_author_david_book )
1651
+
1652
+ assert_not_empty ( david_cpk_book . id . compact )
1653
+ assert_equal david . id , david_cpk_book . author_id
1654
+ assert_not_nil david_cpk_book . number
1655
+ end
1647
1656
1648
1657
def test_generates_composite_primary_key_ids
1649
1658
assert_not_empty ( cpk_orders ( :cpk_groceries_order_1 ) . id . compact )
1650
1659
1651
1660
assert_not_nil ( cpk_books ( :cpk_great_author_first_book ) . author_id )
1652
1661
assert_not_nil ( cpk_books ( :cpk_great_author_first_book ) . number )
1653
1662
end
1663
+
1664
+ def test_generates_composite_primary_key_with_unique_components
1665
+ assert_equal 2 , cpk_orders ( :cpk_groceries_order_1 ) . id . uniq . size
1666
+ end
1654
1667
end
1655
1668
end
Original file line number Diff line number Diff line change @@ -12,3 +12,8 @@ cpk_great_author_second_book:
12
12
cpk_famous_author_first_book :
13
13
title : " Ruby on Rails"
14
14
revision : 1
15
+
16
+ cpk_known_author_david_book :
17
+ author_id : 1
18
+ title : " David's CPK Book"
19
+ revision : 1
You can’t perform that action at this time.
0 commit comments