composite_primary_keys 12.0.2 → 12.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of composite_primary_keys might be problematic. Click here for more details.

Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +30 -0
  3. data/README.rdoc +3 -2
  4. data/lib/composite_primary_keys.rb +57 -56
  5. data/lib/composite_primary_keys/active_model/attribute_assignment.rb +19 -0
  6. data/lib/composite_primary_keys/arel/sqlserver.rb +1 -3
  7. data/lib/composite_primary_keys/associations/through_association.rb +2 -1
  8. data/lib/composite_primary_keys/attribute_methods.rb +1 -1
  9. data/lib/composite_primary_keys/attribute_methods/primary_key.rb +13 -0
  10. data/lib/composite_primary_keys/base.rb +11 -0
  11. data/lib/composite_primary_keys/composite_arrays.rb +0 -8
  12. data/lib/composite_primary_keys/connection_adapters/abstract/database_statements.rb +24 -4
  13. data/lib/composite_primary_keys/connection_adapters/mysql/database_statements.rb +24 -0
  14. data/lib/composite_primary_keys/connection_adapters/sqlserver/database_statements.rb +32 -11
  15. data/lib/composite_primary_keys/core.rb +1 -1
  16. data/lib/composite_primary_keys/persistence.rb +2 -2
  17. data/lib/composite_primary_keys/relation.rb +100 -25
  18. data/lib/composite_primary_keys/relation/batches.rb +1 -1
  19. data/lib/composite_primary_keys/relation/finder_methods.rb +1 -1
  20. data/lib/composite_primary_keys/relation/predicate_builder/association_query_value.rb +1 -1
  21. data/lib/composite_primary_keys/version.rb +1 -1
  22. data/test/abstract_unit.rb +2 -1
  23. data/test/connections/databases.ci.yml +5 -2
  24. data/test/fixtures/article.rb +4 -0
  25. data/test/fixtures/articles.yml +4 -3
  26. data/test/fixtures/comment.rb +1 -3
  27. data/test/fixtures/comments.yml +10 -9
  28. data/test/fixtures/db_definitions/db2-create-tables.sql +0 -14
  29. data/test/fixtures/db_definitions/db2-drop-tables.sql +1 -3
  30. data/test/fixtures/db_definitions/mysql.sql +7 -44
  31. data/test/fixtures/db_definitions/oracle.drop.sql +3 -9
  32. data/test/fixtures/db_definitions/oracle.sql +12 -48
  33. data/test/fixtures/db_definitions/postgresql.sql +7 -44
  34. data/test/fixtures/db_definitions/sqlite.sql +6 -42
  35. data/test/fixtures/db_definitions/sqlserver.sql +5 -41
  36. data/test/fixtures/department.rb +8 -3
  37. data/test/fixtures/departments.yml +4 -4
  38. data/test/fixtures/readings.yml +2 -2
  39. data/test/fixtures/restaurants_suburbs.yml +1 -1
  40. data/test/fixtures/streets.yml +2 -2
  41. data/test/fixtures/suburbs.yml +2 -2
  42. data/test/fixtures/user.rb +3 -2
  43. data/test/test_associations.rb +30 -23
  44. data/test/test_create.rb +41 -18
  45. data/test/test_delete.rb +3 -3
  46. data/test/test_exists.rb +5 -5
  47. data/test/test_find.rb +21 -2
  48. data/test/test_habtm.rb +2 -2
  49. data/test/test_ids.rb +2 -6
  50. data/test/test_nested_attributes.rb +0 -57
  51. data/test/test_polymorphic.rb +29 -13
  52. data/test/test_preload.rb +4 -3
  53. data/test/test_serialize.rb +2 -2
  54. data/test/test_update.rb +19 -1
  55. metadata +11 -25
  56. data/test/fixtures/hack.rb +0 -5
  57. data/test/fixtures/hacks.yml +0 -3
  58. data/test/fixtures/pk_called_id.rb +0 -5
  59. data/test/fixtures/pk_called_ids.yml +0 -11
  60. data/test/fixtures/reference_code_using_composite_key_alias.rb +0 -8
  61. data/test/fixtures/reference_code_using_simple_key_alias.rb +0 -8
  62. data/test/fixtures/seat.rb +0 -5
  63. data/test/fixtures/seats.yml +0 -9
  64. data/test/fixtures/topic.rb +0 -6
  65. data/test/fixtures/topic_source.rb +0 -7
  66. data/test/test_aliases.rb +0 -18
  67. data/test/test_enum.rb +0 -21
  68. data/test/test_suite.rb +0 -35
@@ -1,17 +1,3 @@
1
- create sequence topics_seq start with 1000;
2
-
3
- create table topics (
4
- id number(11) primary key,
5
- name varchar(50) default null,
6
- feed_size number(11) default null
7
- );
8
-
9
- create table topic_sources (
10
- topic_id number(11),
11
- platform varchar(50),
12
- keywords varchar(50) default null
13
- );
14
-
15
1
  create sequence reference_types_seq start with 1000;
16
2
 
17
3
  create table reference_types (
@@ -52,9 +38,11 @@ create table product_tariffs (
52
38
  constraint product_tariffs_pk primary key (product_id, tariff_id, tariff_start_date)
53
39
  );
54
40
 
41
+ create sequence suburbs_city_id_seq start with 1000;
42
+
55
43
  create table suburbs (
56
- city_id number(11),
57
- suburb_id number(11),
44
+ city_id number(11) default suburbs_city_id_seq.nextval not null,
45
+ suburb_id number(11) not null,
58
46
  name varchar(50) not null,
59
47
  constraint suburbs_pk primary key (city_id, suburb_id)
60
48
  );
@@ -113,10 +101,12 @@ create table membership_statuses (
113
101
  status varchar(50) not null
114
102
  );
115
103
 
104
+ create sequence departments_seq start with 1000;
105
+
116
106
  create table departments (
117
- department_id number(11) not null,
107
+ id number(11) not null,
118
108
  location_id number(11) not null,
119
- constraint departments_pk primary key (department_id, location_id)
109
+ constraint departments_pk primary key (id, location_id)
120
110
  );
121
111
 
122
112
  create sequence employees_seq start with 1000;
@@ -132,17 +122,9 @@ create sequence comments_seq start with 1000;
132
122
 
133
123
  create table comments (
134
124
  id number(11) not null primary key,
135
- person_id number(11) default null,
136
- shown number(11) default null,
137
- person_type varchar(100) default null,
138
- hack_id number(11) default null
139
- );
140
-
141
- create sequence hacks_seq start with 1000;
142
-
143
- create table hacks (
144
- id number(11) not null primary key,
145
- name varchar(50) not null
125
+ article_id number(11) not null,
126
+ person_id number(11) not null,
127
+ person_type varchar(100) not null
146
128
  );
147
129
 
148
130
  create table restaurants (
@@ -200,13 +182,6 @@ create table room_assignments (
200
182
  room_id number(11) not null
201
183
  );
202
184
 
203
- create table seats (
204
- flight_number int not null,
205
- seat int not null,
206
- customer int,
207
- primary key (flight_number, seat)
208
- );
209
-
210
185
  create table capitols (
211
186
  country varchar(100) not null,
212
187
  city varchar(100) not null,
@@ -222,15 +197,4 @@ create table products_restaurants (
222
197
  create table employees_groups (
223
198
  employee_id int not null,
224
199
  group_id int not null
225
- );
226
-
227
- create sequence pk_called_ids_seq start with 1000;
228
-
229
- create table pk_called_ids (
230
- id int not null,
231
- reference_code int not null,
232
- code_label varchar(50) default null,
233
- abbreviation varchar(50) default null,
234
- description varchar(50) default null,
235
- constraint pk_called_ids_pk primary key (id, reference_code)
236
- );
200
+ );
@@ -1,17 +1,3 @@
1
- create table topics (
2
- id serial not null,
3
- name varchar(50) default null,
4
- feed_size int default null,
5
- primary key (id)
6
- );
7
-
8
- create table topic_sources (
9
- topic_id int not null,
10
- platform varchar(50) not null,
11
- keywords varchar(50) default null,
12
- primary key (topic_id,platform)
13
- );
14
-
15
1
  create table reference_types (
16
2
  reference_type_id serial not null,
17
3
  type_label varchar(50) default null,
@@ -109,9 +95,9 @@ create table membership_statuses (
109
95
  );
110
96
 
111
97
  create table departments (
112
- department_id int not null,
113
- location_id int not null,
114
- primary key (department_id, location_id)
98
+ id serial not null,
99
+ location_id int not null,
100
+ primary key (id, location_id)
115
101
  );
116
102
 
117
103
  create table employees (
@@ -124,16 +110,9 @@ create table employees (
124
110
 
125
111
  create table comments (
126
112
  id serial not null,
127
- person_id int default null,
128
- shown int default null,
129
- person_type varchar(100) default null,
130
- hack_id int default null,
131
- primary key (id)
132
- );
133
-
134
- create table hacks (
135
- id serial not null,
136
- name varchar(50) not null,
113
+ article_id int not null references articles (id),
114
+ person_id int not null,
115
+ person_type varchar(100) not null,
137
116
  primary key (id)
138
117
  );
139
118
 
@@ -186,13 +165,6 @@ create table room_assignments (
186
165
  room_id int not null
187
166
  );
188
167
 
189
- create table seats (
190
- flight_number int not null,
191
- seat int not null,
192
- customer int,
193
- primary key (flight_number, seat)
194
- );
195
-
196
168
  create table capitols (
197
169
  country text not null,
198
170
  city text not null,
@@ -208,13 +180,4 @@ create table products_restaurants (
208
180
  create table employees_groups (
209
181
  employee_id int not null,
210
182
  group_id int not null
211
- );
212
-
213
- create table pk_called_ids (
214
- id serial not null,
215
- reference_code int not null,
216
- code_label varchar(50) default null,
217
- abbreviation varchar(50) default null,
218
- description varchar(50) default null,
219
- primary key (id, reference_code)
220
- );
183
+ );
@@ -1,17 +1,3 @@
1
- create table topics (
2
- id int not null,
3
- name varchar(50) default null,
4
- feed_size int default null,
5
- primary key (id)
6
- );
7
-
8
- create table topic_sources (
9
- topic_id int not null,
10
- platform varchar(50) not null,
11
- keywords varchar(50) default null,
12
- primary key (topic_id,platform)
13
- );
14
-
15
1
  create table reference_types (
16
2
  reference_type_id integer primary key,
17
3
  type_label varchar(50) default null,
@@ -101,9 +87,9 @@ create table membership_statuses (
101
87
  );
102
88
 
103
89
  create table departments (
104
- department_id integer not null,
90
+ id integer not null,
105
91
  location_id integer not null,
106
- primary key (department_id, location_id)
92
+ primary key (id, location_id)
107
93
  );
108
94
 
109
95
  create table employees (
@@ -115,15 +101,9 @@ create table employees (
115
101
 
116
102
  create table comments (
117
103
  id integer not null primary key autoincrement,
118
- person_id int null,
119
- shown int null,
120
- person_type varchar(100) null,
121
- hack_id int null
122
- );
123
-
124
- create table hacks (
125
- id integer not null primary key autoincrement,
126
- name varchar(50) not null
104
+ article_id int not null,
105
+ person_id int not null,
106
+ person_type varchar(100) not null
127
107
  );
128
108
 
129
109
  create table restaurants (
@@ -172,13 +152,6 @@ create table room_assignments (
172
152
  room_id integer not null
173
153
  );
174
154
 
175
- create table seats (
176
- flight_number integer not_null,
177
- seat integer not_null,
178
- customer integer,
179
- primary key (flight_number, seat)
180
- );
181
-
182
155
  create table capitols (
183
156
  country text not null,
184
157
  city text not null,
@@ -194,13 +167,4 @@ create table products_restaurants (
194
167
  create table employees_groups (
195
168
  employee_id integer not null,
196
169
  group_id integer not null
197
- );
198
-
199
- create table pk_called_ids (
200
- id integer not null,
201
- reference_code int not null,
202
- code_label varchar(50) default null,
203
- abbreviation varchar(50) default null,
204
- description varchar(50) default null,
205
- primary key (id, reference_code)
206
- );
170
+ );
@@ -1,17 +1,5 @@
1
1
  USE [composite_primary_keys_unittest];
2
2
 
3
- CREATE TABLE topics (
4
- id [int] IDENTITY(1000,1) NOT NULL,
5
- name [varchar](50) default NULL,
6
- feed_size [int] default NULL
7
- );
8
-
9
- CREATE TABLE topic_sources (
10
- topic_id [int] NOT NULL,
11
- platform [varchar](50) NOT NULL,
12
- keywords [varchar](50) default NULL,
13
- );
14
-
15
3
  CREATE TABLE reference_types (
16
4
  reference_type_id [int] IDENTITY(1000,1) NOT NULL,
17
5
  type_label [varchar](50) NULL,
@@ -102,10 +90,10 @@ CREATE TABLE membership_statuses (
102
90
  );
103
91
 
104
92
  CREATE TABLE departments (
105
- department_id [int] NOT NULL,
93
+ id [int] IDENTITY(100,1) NOT NULL,
106
94
  location_id [int] NOT NULL
107
95
  CONSTRAINT [departments_pk] PRIMARY KEY
108
- ( [department_id], [location_id] )
96
+ ( [id], [location_id] )
109
97
  );
110
98
 
111
99
  CREATE TABLE employees (
@@ -117,15 +105,9 @@ CREATE TABLE employees (
117
105
 
118
106
  CREATE TABLE comments (
119
107
  id [int] IDENTITY(1000,1) PRIMARY KEY NOT NULL,
120
- person_id [int] NULL,
121
- shown [int] NULL,
122
- person_type varchar(100) NULL,
123
- hack_id [int] NULL
124
- );
125
-
126
- CREATE TABLE hacks (
127
- id [int] IDENTITY(1000,1) PRIMARY KEY NOT NULL,
128
- name [varchar](50) NOT NULL
108
+ article_id [int] NOT NULL,
109
+ person_id [int] NOT NULL,
110
+ person_type varchar(100) NULL
129
111
  );
130
112
 
131
113
  CREATE TABLE restaurants (
@@ -176,14 +158,6 @@ CREATE TABLE room_assignments (
176
158
  room_id [int] NOT NULL
177
159
  );
178
160
 
179
- CREATE TABLE seats (
180
- flight_number [int] NOT NULL,
181
- seat [int] NOT NULL,
182
- customer [int]
183
- CONSTRAINT [seats_pk] PRIMARY KEY
184
- ( [flight_number], [seat] )
185
- );
186
-
187
161
  CREATE TABLE capitols (
188
162
  country varchar(450) NOT NULL,
189
163
  city varchar(450) NOT NULL
@@ -200,14 +174,4 @@ CREATE TABLE products_restaurants (
200
174
  CREATE TABLE employees_groups (
201
175
  employee_id [int] not null,
202
176
  group_id [int] not null
203
- );
204
-
205
- CREATE TABLE pk_called_ids (
206
- id [int] IDENTITY(1000,1) NOT NULL,
207
- reference_code [int] not null,
208
- code_label [varchar](50) default null,
209
- abbreviation [varchar](50) default null,
210
- description [varchar](50) default null
211
- CONSTRAINT [pk_called_ids_pk] PRIMARY KEY
212
- ( [id], [reference_code] )
213
177
  );
@@ -1,11 +1,16 @@
1
1
  class Department < ActiveRecord::Base
2
- self.primary_keys = :department_id, :location_id
2
+ self.primary_keys = :id, :location_id
3
+
3
4
  has_many :employees,
4
5
  # We intentionally redefine primary key for test purposes. #455
5
- :primary_key => [:department_id, :location_id],
6
+ :primary_key => [:id, :location_id],
6
7
  :foreign_key => [:department_id, :location_id]
8
+
9
+ has_many :comments, :through => :employees
10
+
7
11
  has_one :head, :class_name => 'Employee', :autosave => true, :dependent => :delete,
8
12
  # We intentionally redefine primary key for test purposes. #455
9
- :primary_key => [:department_id, :location_id],
13
+ :primary_key => [:id, :location_id],
10
14
  :foreign_key => [:department_id, :location_id]
15
+
11
16
  end
@@ -1,15 +1,15 @@
1
1
  accounting:
2
- department_id: 1
2
+ id: 1
3
3
  location_id: 1
4
4
 
5
5
  engineering:
6
- department_id: 2
6
+ id: 2
7
7
  location_id: 1
8
8
 
9
9
  human_resources:
10
- department_id: 3
10
+ id: 3
11
11
  location_id: 2
12
12
 
13
13
  offsite_accounting:
14
- department_id: 1
14
+ id: 1
15
15
  location_id: 2
@@ -1,11 +1,11 @@
1
1
  santiago_first:
2
2
  id: 1
3
3
  user_id: 1
4
- article_id: 1
4
+ article: first
5
5
  rating: 4
6
6
 
7
7
  santiago_second:
8
8
  id: 2
9
9
  user_id: 1
10
- article_id: 2
10
+ article: second
11
11
  rating: 5
@@ -8,4 +8,4 @@ b:
8
8
  franchise_id: 1
9
9
  store_id: 1
10
10
  city_id: 2
11
- suburb_id: 1
11
+ suburb_id: 2
@@ -7,11 +7,11 @@ first:
7
7
  second1:
8
8
  id: 2
9
9
  city_id: 2
10
- suburb_id: 1
10
+ suburb_id: 2
11
11
  name: First Street
12
12
 
13
13
  second2:
14
14
  id: 3
15
15
  city_id: 2
16
- suburb_id: 1
16
+ suburb_id: 2
17
17
  name: Second Street
@@ -5,10 +5,10 @@ first:
5
5
 
6
6
  second:
7
7
  city_id: 2
8
- suburb_id: 1
8
+ suburb_id: 2
9
9
  name: Second Suburb
10
10
 
11
11
  no_mcdonalds:
12
12
  city_id: 1
13
- suburb_id: 2
13
+ suburb_id: 3
14
14
  name: Third Suburb
@@ -1,9 +1,10 @@
1
1
  class User < ActiveRecord::Base
2
2
  has_many :readings
3
3
  has_many :articles, :through => :readings
4
+
4
5
  has_many :comments, :as => :person
5
- has_many :hacks, :through => :comments, :source => :hack
6
-
6
+ has_one :first_comment, :as => :person, :class_name => "Comment"
7
+
7
8
  def find_custom_articles
8
9
  articles.where("name = ?", "Article One")
9
10
  end
@@ -96,18 +96,23 @@ class TestAssociations < ActiveSupport::TestCase
96
96
  end
97
97
 
98
98
  def test_has_one_association_primary_key_and_foreign_key_are_present
99
- department = departments(:human_resources)
99
+ # department = departments(:engineering)
100
+ # assert_equal(2, department.employees.count)
101
+ # assert_equal('Sarah', department.employees[0].name)
102
+ # assert_equal('Robert', department.employees[1].name)
103
+ # assert_equal('Sarah', department.head.name)
100
104
 
105
+ department = departments(:human_resources)
101
106
  assert_equal(1, department.employees.count)
102
107
  assert_equal('Mindy', department.employees[0].name)
108
+ assert_equal('Mindy', department.head.name)
103
109
 
104
110
  head = department.create_head(name: 'Rick')
105
- assert_equal(department.department_id, head.department_id)
106
- assert_equal(department.location_id, head.location_id)
111
+ assert_equal(department, head.department)
112
+ assert_equal('Rick', department.head.name)
107
113
 
108
114
  department.reload
109
115
  assert_equal(1, department.employees.count)
110
- assert_equal('Rick', department.employees[0].name)
111
116
  end
112
117
 
113
118
  def test_has_one_autosave
@@ -139,9 +144,10 @@ class TestAssociations < ActiveSupport::TestCase
139
144
 
140
145
  department.reload
141
146
  assert_equal(3, department.employees.count)
142
- assert_equal('Steve', department.employees[0].name)
143
- assert_equal('Jill', department.employees[1].name)
144
- assert_equal('Rick', department.employees[2].name)
147
+ employees = department.employees.sort_by(&:name)
148
+ assert_equal('Jill', employees[0].name)
149
+ assert_equal('Rick', employees[1].name)
150
+ assert_equal('Steve', employees[2].name)
145
151
  end
146
152
 
147
153
  def test_find_includes_product_tariffs_product
@@ -174,6 +180,13 @@ class TestAssociations < ActiveSupport::TestCase
174
180
  assert_equal(3, tarrifs_length)
175
181
  end
176
182
 
183
+ def test_has_many_through_2
184
+ assert_equal(3, Article.count)
185
+ user = users(:santiago)
186
+ article_names = user.articles.map(&:name).sort
187
+ assert_equal(['Article One', 'Article Two'], article_names)
188
+ end
189
+
177
190
  def test_new_style_includes_with_conditions
178
191
  product_tariff = ProductTariff.includes(:tariff).where('tariffs.amount < 5').references(:tariffs).first
179
192
  assert_equal(0, product_tariff.tariff.amount)
@@ -203,16 +216,8 @@ class TestAssociations < ActiveSupport::TestCase
203
216
  end
204
217
 
205
218
  def test_associations_with_conditions
206
- suburb = Suburb.find([2, 1])
207
- assert_equal 2, suburb.streets.size
208
-
209
- suburb = Suburb.find([2, 1])
210
- assert_equal 1, suburb.first_streets.size
211
-
212
- suburb = Suburb.includes(:streets).find([2, 1])
219
+ suburb = Suburb.find([2, 2])
213
220
  assert_equal 2, suburb.streets.size
214
-
215
- suburb = Suburb.includes(:first_streets).find([2, 1])
216
221
  assert_equal 1, suburb.first_streets.size
217
222
  end
218
223
 
@@ -239,7 +244,7 @@ class TestAssociations < ActiveSupport::TestCase
239
244
  steve = employees(:steve)
240
245
  steve.department = departments(:engineering)
241
246
  # It was returning this before:
242
- # {"[:department_id, :location_id]"=>[nil, [2, 1]]}
247
+ # {"[:id, :location_id]"=>[nil, [2, 1]]}
243
248
  assert_equal({"department_id"=>[1, 2]}, steve.changes)
244
249
  end
245
250
 
@@ -263,12 +268,12 @@ class TestAssociations < ActiveSupport::TestCase
263
268
  assert_equal user, reading.user
264
269
  end
265
270
 
266
- def test_has_many_build__composite_key
271
+ def test_has_many_build_composite_key
267
272
  department = departments(:engineering)
268
273
  employee = department.employees.build
269
- assert_equal department.department_id, employee.department_id
270
- assert_equal department.location_id, employee.location_id
271
- assert_equal department, employee.department
274
+ assert_equal(department[:id], employee.department_id)
275
+ assert_equal(department.location_id, employee.location_id)
276
+ assert_equal(department, employee.department)
272
277
  end
273
278
 
274
279
  def test_has_many_with_primary_key
@@ -331,9 +336,11 @@ class TestAssociations < ActiveSupport::TestCase
331
336
  end
332
337
 
333
338
  def test_limitable_reflections
334
- memberships = Membership.includes(:statuses).where("membership_statuses.status = ?", 'Active').references(:membership_statuses).limit(1)
335
- assert_equal(1, memberships.length)
339
+ memberships = Membership.includes(:statuses).where("membership_statuses.status = ?", 'Active').references(:membership_statuses)
340
+ assert_equal(2, memberships.length)
341
+
336
342
  assert_equal([1,1], memberships[0].id)
343
+ assert_equal([3,2], memberships[1].id)
337
344
  end
338
345
 
339
346
  def test_foreign_key_present_with_null_association_ids