composite_primary_keys 7.0.13 → 7.0.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +615 -608
  3. data/lib/composite_primary_keys.rb +110 -110
  4. data/lib/composite_primary_keys/associations/association.rb +23 -23
  5. data/lib/composite_primary_keys/associations/association_scope.rb +77 -77
  6. data/lib/composite_primary_keys/associations/has_and_belongs_to_many_association.rb +59 -59
  7. data/lib/composite_primary_keys/associations/has_many_association.rb +56 -56
  8. data/lib/composite_primary_keys/associations/join_dependency.rb +89 -89
  9. data/lib/composite_primary_keys/associations/join_dependency/join_part.rb +38 -38
  10. data/lib/composite_primary_keys/associations/preloader/association.rb +78 -78
  11. data/lib/composite_primary_keys/associations/preloader/has_and_belongs_to_many.rb +46 -46
  12. data/lib/composite_primary_keys/attribute_methods/dirty.rb +26 -26
  13. data/lib/composite_primary_keys/attribute_methods/read.rb +34 -34
  14. data/lib/composite_primary_keys/attribute_methods/write.rb +36 -36
  15. data/lib/composite_primary_keys/base.rb +0 -6
  16. data/lib/composite_primary_keys/composite_arrays.rb +30 -30
  17. data/lib/composite_primary_keys/connection_adapters/abstract/connection_specification_changes.rb +4 -2
  18. data/lib/composite_primary_keys/connection_adapters/sqlserver_adapter.rb +17 -0
  19. data/lib/composite_primary_keys/core.rb +47 -47
  20. data/lib/composite_primary_keys/persistence.rb +60 -60
  21. data/lib/composite_primary_keys/relation.rb +56 -56
  22. data/lib/composite_primary_keys/relation/calculations.rb +75 -65
  23. data/lib/composite_primary_keys/relation/finder_methods.rb +196 -196
  24. data/lib/composite_primary_keys/sanitization.rb +52 -52
  25. data/lib/composite_primary_keys/validations/uniqueness.rb +37 -39
  26. data/lib/composite_primary_keys/version.rb +8 -8
  27. data/tasks/databases/sqlserver.rake +40 -27
  28. data/test/connections/databases.example.yml +18 -18
  29. data/test/connections/native_sqlserver/connection.rb +14 -11
  30. data/test/fixtures/db_definitions/mysql.sql +208 -208
  31. data/test/fixtures/db_definitions/postgresql.sql +210 -210
  32. data/test/fixtures/db_definitions/sqlite.sql +197 -197
  33. data/test/fixtures/db_definitions/sqlserver.drop.sql +94 -91
  34. data/test/fixtures/db_definitions/sqlserver.sql +232 -226
  35. data/test/fixtures/employee.rb +5 -5
  36. data/test/test_associations.rb +275 -275
  37. data/test/test_attributes.rb +60 -60
  38. data/test/test_create.rb +112 -112
  39. data/test/test_delete.rb +152 -148
  40. data/test/test_delete_all.rb +21 -21
  41. data/test/test_enum.rb +20 -20
  42. data/test/test_equal.rb +1 -1
  43. data/test/test_tutorial_example.rb +21 -21
  44. metadata +3 -2
@@ -1,5 +1,5 @@
1
- class Employee < ActiveRecord::Base
2
- belongs_to :department, :foreign_key => [:department_id, :location_id]
3
- has_many :comments, :as => :person
4
- has_and_belongs_to_many :groups
5
- end
1
+ class Employee < ActiveRecord::Base
2
+ belongs_to :department, :foreign_key => [:department_id, :location_id]
3
+ has_many :comments, :as => :person
4
+ has_and_belongs_to_many :groups
5
+ end
@@ -1,275 +1,275 @@
1
- require File.expand_path('../abstract_unit', __FILE__)
2
-
3
- class TestAssociations < ActiveSupport::TestCase
4
- fixtures :articles, :products, :tariffs, :product_tariffs, :suburbs, :streets, :restaurants,
5
- :dorms, :rooms, :room_attributes, :room_attribute_assignments, :students, :room_assignments, :users, :readings,
6
- :departments, :employees, :memberships, :membership_statuses
7
-
8
- def test_products
9
- assert_not_nil products(:first_product).product_tariffs
10
- assert_equal 2, products(:first_product).product_tariffs.length
11
- assert_not_nil products(:first_product).tariffs
12
- assert_equal 2, products(:first_product).tariffs.length
13
- end
14
-
15
- def test_product_tariffs
16
- assert_not_nil product_tariffs(:first_flat).product
17
- assert_not_nil product_tariffs(:first_flat).tariff
18
- assert_equal Product, product_tariffs(:first_flat).product.class
19
- assert_equal Tariff, product_tariffs(:first_flat).tariff.class
20
- end
21
-
22
- def test_tariffs
23
- assert_not_nil tariffs(:flat).product_tariffs
24
- assert_equal 1, tariffs(:flat).product_tariffs.length
25
- assert_not_nil tariffs(:flat).products
26
- assert_equal 1, tariffs(:flat).products.length
27
- end
28
-
29
- # Its not generating the instances of associated classes from the rows
30
- def test_find_includes
31
- # Old style
32
- products = Product.includes(:product_tariffs).all
33
- assert_equal(3, products.length)
34
- assert_equal(3, products.inject(0) {|sum, product| sum + product.product_tariffs.length})
35
-
36
- # New style
37
- products = Product.includes(:product_tariffs)
38
- assert_equal(3, products.length)
39
- assert_equal(3, products.inject(0) {|sum, product| sum + product.product_tariffs.length})
40
- end
41
-
42
- def test_find_includes_eager_loading
43
- product = products(:second_product)
44
- product_tarrif = product_tariffs(:second_free)
45
-
46
- # First get a legitimate product tarrif
47
- products = Product.includes(:product_tariffs).where('product_tariffs.product_id = ?', product.id).references(:product_tariffs)
48
- assert_equal(1, products.length)
49
- assert_equal(product, products.first)
50
- assert_equal([product_tarrif], products.first.product_tariffs)
51
- end
52
-
53
- def test_find_eager_loading_none
54
- product = products(:third_product)
55
-
56
- products = Product.includes(:product_tariffs).where(:id => product.id).references(:product_tariffs)
57
- assert_equal(1, products.length)
58
- assert_equal(product, products.first)
59
- assert_empty(products.first.product_tariffs)
60
- end
61
-
62
- def test_find_includes_tariffs
63
- # Old style
64
- tariffs = Tariff.includes(:product_tariffs)
65
- assert_equal(3, tariffs.length)
66
- assert_equal(3, tariffs.inject(0) {|sum, tariff| sum + tariff.product_tariffs.length})
67
-
68
- # New style
69
- tariffs = Tariff.includes(:product_tariffs)
70
- assert_equal(3, tariffs.length)
71
- assert_equal(3, tariffs.inject(0) {|sum, tariff| sum + tariff.product_tariffs.length})
72
- end
73
-
74
- def test_find_includes_product_tariffs_product
75
- # Old style
76
- product_tariffs = ProductTariff.includes(:product)
77
- assert_not_nil(product_tariffs)
78
- assert_equal(3, product_tariffs.length)
79
-
80
- # New style
81
- product_tariffs = ProductTariff.includes(:product)
82
- assert_not_nil(product_tariffs)
83
- assert_equal(3, product_tariffs.length)
84
- end
85
-
86
- def test_find_includes_product_tariffs_tariff
87
- # Old style
88
- product_tariffs = ProductTariff.includes(:tariff)
89
- assert_equal(3, product_tariffs.length)
90
-
91
- # New style
92
- product_tariffs = ProductTariff.includes(:tariff)
93
- assert_equal(3, product_tariffs.length)
94
- end
95
-
96
- def test_has_many_through
97
- products = Product.includes(:tariffs)
98
- assert_equal(3, products.length)
99
-
100
- tarrifs_length = products.inject(0) {|sum, product| sum + product.tariffs.length}
101
- assert_equal(3, tarrifs_length)
102
- end
103
-
104
- def test_new_style_includes_with_conditions
105
- product_tariff = ProductTariff.includes(:tariff).where('tariffs.amount < 5').references(:tariffs).first
106
- assert_equal(0, product_tariff.tariff.amount)
107
- end
108
-
109
- def test_find_product_includes
110
- products = Product.includes(:product_tariffs => :tariff)
111
- assert_equal(3, products.length)
112
-
113
- product_tariffs_length = products.inject(0) {|sum, product| sum + product.product_tariffs.length}
114
- assert_equal(3, product_tariffs_length)
115
- end
116
-
117
- def test_find_tariffs_includes
118
- tariffs = Tariff.includes(:product_tariffs => :product)
119
- assert_equal(3, tariffs.length)
120
-
121
- product_tariffs_length = tariffs.inject(0) {|sum, tariff| sum + tariff.product_tariffs.length}
122
- assert_equal(3, product_tariffs_length)
123
- end
124
-
125
- def test_has_many_through_when_not_pre_loaded
126
- student = Student.first
127
- rooms = student.rooms
128
- assert_equal(1, rooms.size)
129
- assert_equal(1, rooms.first.dorm_id)
130
- assert_equal(1, rooms.first.room_id)
131
- end
132
-
133
- def test_has_many_through_when_through_association_is_composite
134
- dorm = Dorm.first
135
- assert_equal(3, dorm.rooms.length)
136
- assert_equal(1, dorm.rooms.first.room_attributes.length)
137
- assert_equal('type', dorm.rooms.first.room_attributes.first.name)
138
- end
139
-
140
- def test_associations_with_conditions
141
- suburb = Suburb.find([2, 1])
142
- assert_equal 2, suburb.streets.size
143
-
144
- suburb = Suburb.find([2, 1])
145
- assert_equal 1, suburb.first_streets.size
146
-
147
- suburb = Suburb.includes(:streets).find([2, 1])
148
- assert_equal 2, suburb.streets.size
149
-
150
- suburb = Suburb.includes(:first_streets).find([2, 1])
151
- assert_equal 1, suburb.first_streets.size
152
- end
153
-
154
- def test_composite_has_many_composites
155
- room = rooms(:branner_room_1)
156
- assert_equal(2, room.room_assignments.length)
157
- assert_equal(room_assignments(:jacksons_room), room.room_assignments[0])
158
- assert_equal(room_assignments(:bobs_room), room.room_assignments[1])
159
- end
160
-
161
- def test_composite_belongs_to_composite
162
- room_assignment = room_assignments(:jacksons_room)
163
- assert_equal(rooms(:branner_room_1), room_assignment.room)
164
- end
165
-
166
- def test_composite_belongs_to_changes
167
- room_assignment = room_assignments(:jacksons_room)
168
- room_assignment.room = rooms(:branner_room_2)
169
- # This was raising an error before:
170
- # TypeError: [:dorm_id, :room_id] is not a symbol
171
- # changes returns HashWithIndifferentAccess
172
- assert_equal({"room_id"=>[1, 2]}, room_assignment.changes)
173
-
174
- steve = employees(:steve)
175
- steve.department = departments(:engineering)
176
- # It was returning this before:
177
- # {"[:department_id, :location_id]"=>[nil, [2, 1]]}
178
- assert_equal({"department_id"=>[1, 2]}, steve.changes)
179
- end
180
-
181
- def test_composite_belongs_to__setting_to_nil
182
- room_assignment = room_assignments(:jacksons_room)
183
- # This was raising an error before:
184
- # NoMethodError: undefined method `length' for nil:NilClass
185
- assert_nothing_raised { room_assignment.room = nil }
186
- end
187
-
188
- def test_has_one_with_composite
189
- # In this case a regular model has_one composite model
190
- department = departments(:engineering)
191
- assert_not_nil(department.head)
192
- end
193
-
194
- def test_has_many_build__simple_key
195
- user = users(:santiago)
196
- reading = user.readings.build
197
- assert_equal user.id, reading.user_id
198
- assert_equal user, reading.user
199
- end
200
-
201
- def test_has_many_build__composite_key
202
- department = departments(:engineering)
203
- employee = department.employees.build
204
- assert_equal department.department_id, employee.department_id
205
- assert_equal department.location_id, employee.location_id
206
- assert_equal department, employee.department
207
- end
208
-
209
- def test_has_many_with_primary_key
210
- @membership = Membership.find([1, 1])
211
- assert_equal 2, @membership.readings.size
212
- end
213
-
214
- def test_has_many_with_composite_key
215
- # In this case a regular model (Dorm) has_many composite models (Rooms)
216
- dorm = dorms(:branner)
217
- assert_equal(3, dorm.rooms.length)
218
- assert_equal(1, dorm.rooms[0].room_id)
219
- assert_equal(2, dorm.rooms[1].room_id)
220
- assert_equal(3, dorm.rooms[2].room_id)
221
- end
222
-
223
- def test_joins_has_many_with_primary_key
224
- #@membership = Membership.find(:first, :joins => :readings, :conditions => { :readings => { :id => 1 } })
225
- @membership = Membership.joins(:readings).where(readings: { id: 1 }).first
226
-
227
- assert_equal [1, 1], @membership.id
228
- end
229
-
230
- def test_joins_has_one_with_primary_key
231
- @membership = Membership.joins(:readings).where(readings: { id: 2 }).first
232
-
233
- assert_equal [1, 1], @membership.id
234
- end
235
-
236
- def test_has_many_through_with_conditions_when_through_association_is_not_composite
237
- user = User.first
238
- assert_equal 1, user.articles.where("articles.name = ?", "Article One").size
239
- end
240
-
241
- def test_has_many_through_with_conditions_when_through_association_is_composite
242
- room = Room.first
243
- assert_equal 0, room.room_attributes.where("room_attributes.name != ?", "type").size
244
- end
245
-
246
- def test_has_many_through_on_custom_finder_when_through_association_is_composite_finder_when_through_association_is_not_composite
247
- user = User.first
248
- assert_equal(1, user.find_custom_articles.size)
249
- end
250
-
251
- def test_has_many_through_on_custom_finder_when_through_association_is_composite
252
- room = Room.first
253
- assert_equal(0, room.find_custom_room_attributes.size)
254
- end
255
-
256
- def test_has_many_with_primary_key_with_associations
257
- memberships = Membership.includes(:statuses).where("membership_statuses.status = ?", 'Active').references(:membership_statuses)
258
- assert_equal(2, memberships.length)
259
- assert_equal([1,1], memberships[0].id)
260
- assert_equal([3,2], memberships[1].id)
261
- end
262
-
263
- def test_limitable_reflections
264
- memberships = Membership.includes(:statuses).where("membership_statuses.status = ?", 'Active').references(:membership_statuses).limit(1)
265
- assert_equal(1, memberships.length)
266
- assert_equal([1,1], memberships[0].id)
267
- end
268
-
269
- def test_foreign_key_present_with_null_association_ids
270
- group = Group.new
271
- group.memberships.build
272
- associations = group.association_cache[:memberships]
273
- assert_equal(false, associations.send('foreign_key_present?'))
274
- end
275
- end
1
+ require File.expand_path('../abstract_unit', __FILE__)
2
+
3
+ class TestAssociations < ActiveSupport::TestCase
4
+ fixtures :articles, :products, :tariffs, :product_tariffs, :suburbs, :streets, :restaurants,
5
+ :dorms, :rooms, :room_attributes, :room_attribute_assignments, :students, :room_assignments, :users, :readings,
6
+ :departments, :employees, :memberships, :membership_statuses
7
+
8
+ def test_products
9
+ assert_not_nil products(:first_product).product_tariffs
10
+ assert_equal 2, products(:first_product).product_tariffs.length
11
+ assert_not_nil products(:first_product).tariffs
12
+ assert_equal 2, products(:first_product).tariffs.length
13
+ end
14
+
15
+ def test_product_tariffs
16
+ assert_not_nil product_tariffs(:first_flat).product
17
+ assert_not_nil product_tariffs(:first_flat).tariff
18
+ assert_equal Product, product_tariffs(:first_flat).product.class
19
+ assert_equal Tariff, product_tariffs(:first_flat).tariff.class
20
+ end
21
+
22
+ def test_tariffs
23
+ assert_not_nil tariffs(:flat).product_tariffs
24
+ assert_equal 1, tariffs(:flat).product_tariffs.length
25
+ assert_not_nil tariffs(:flat).products
26
+ assert_equal 1, tariffs(:flat).products.length
27
+ end
28
+
29
+ # Its not generating the instances of associated classes from the rows
30
+ def test_find_includes
31
+ # Old style
32
+ products = Product.includes(:product_tariffs).all
33
+ assert_equal(3, products.length)
34
+ assert_equal(3, products.inject(0) {|sum, product| sum + product.product_tariffs.length})
35
+
36
+ # New style
37
+ products = Product.includes(:product_tariffs)
38
+ assert_equal(3, products.length)
39
+ assert_equal(3, products.inject(0) {|sum, product| sum + product.product_tariffs.length})
40
+ end
41
+
42
+ def test_find_includes_eager_loading
43
+ product = products(:second_product)
44
+ product_tarrif = product_tariffs(:second_free)
45
+
46
+ # First get a legitimate product tarrif
47
+ products = Product.includes(:product_tariffs).where('product_tariffs.product_id = ?', product.id).references(:product_tariffs)
48
+ assert_equal(1, products.length)
49
+ assert_equal(product, products.first)
50
+ assert_equal([product_tarrif], products.first.product_tariffs)
51
+ end
52
+
53
+ def test_find_eager_loading_none
54
+ product = products(:third_product)
55
+
56
+ products = Product.includes(:product_tariffs).where(:id => product.id).references(:product_tariffs)
57
+ assert_equal(1, products.length)
58
+ assert_equal(product, products.first)
59
+ assert_empty(products.first.product_tariffs)
60
+ end
61
+
62
+ def test_find_includes_tariffs
63
+ # Old style
64
+ tariffs = Tariff.includes(:product_tariffs)
65
+ assert_equal(3, tariffs.length)
66
+ assert_equal(3, tariffs.inject(0) {|sum, tariff| sum + tariff.product_tariffs.length})
67
+
68
+ # New style
69
+ tariffs = Tariff.includes(:product_tariffs)
70
+ assert_equal(3, tariffs.length)
71
+ assert_equal(3, tariffs.inject(0) {|sum, tariff| sum + tariff.product_tariffs.length})
72
+ end
73
+
74
+ def test_find_includes_product_tariffs_product
75
+ # Old style
76
+ product_tariffs = ProductTariff.includes(:product)
77
+ assert_not_nil(product_tariffs)
78
+ assert_equal(3, product_tariffs.length)
79
+
80
+ # New style
81
+ product_tariffs = ProductTariff.includes(:product)
82
+ assert_not_nil(product_tariffs)
83
+ assert_equal(3, product_tariffs.length)
84
+ end
85
+
86
+ def test_find_includes_product_tariffs_tariff
87
+ # Old style
88
+ product_tariffs = ProductTariff.includes(:tariff)
89
+ assert_equal(3, product_tariffs.length)
90
+
91
+ # New style
92
+ product_tariffs = ProductTariff.includes(:tariff)
93
+ assert_equal(3, product_tariffs.length)
94
+ end
95
+
96
+ def test_has_many_through
97
+ products = Product.includes(:tariffs)
98
+ assert_equal(3, products.length)
99
+
100
+ tarrifs_length = products.inject(0) {|sum, product| sum + product.tariffs.length}
101
+ assert_equal(3, tarrifs_length)
102
+ end
103
+
104
+ def test_new_style_includes_with_conditions
105
+ product_tariff = ProductTariff.includes(:tariff).where('tariffs.amount < 5').references(:tariffs).first
106
+ assert_equal(0, product_tariff.tariff.amount)
107
+ end
108
+
109
+ def test_find_product_includes
110
+ products = Product.includes(:product_tariffs => :tariff)
111
+ assert_equal(3, products.length)
112
+
113
+ product_tariffs_length = products.inject(0) {|sum, product| sum + product.product_tariffs.length}
114
+ assert_equal(3, product_tariffs_length)
115
+ end
116
+
117
+ def test_find_tariffs_includes
118
+ tariffs = Tariff.includes(:product_tariffs => :product)
119
+ assert_equal(3, tariffs.length)
120
+
121
+ product_tariffs_length = tariffs.inject(0) {|sum, tariff| sum + tariff.product_tariffs.length}
122
+ assert_equal(3, product_tariffs_length)
123
+ end
124
+
125
+ def test_has_many_through_when_not_pre_loaded
126
+ student = Student.first
127
+ rooms = student.rooms
128
+ assert_equal(1, rooms.size)
129
+ assert_equal(1, rooms.first.dorm_id)
130
+ assert_equal(1, rooms.first.room_id)
131
+ end
132
+
133
+ def test_has_many_through_when_through_association_is_composite
134
+ dorm = Dorm.first
135
+ assert_equal(3, dorm.rooms.length)
136
+ assert_equal(1, dorm.rooms.first.room_attributes.length)
137
+ assert_equal('type', dorm.rooms.first.room_attributes.first.name)
138
+ end
139
+
140
+ def test_associations_with_conditions
141
+ suburb = Suburb.find([2, 1])
142
+ assert_equal 2, suburb.streets.size
143
+
144
+ suburb = Suburb.find([2, 1])
145
+ assert_equal 1, suburb.first_streets.size
146
+
147
+ suburb = Suburb.includes(:streets).find([2, 1])
148
+ assert_equal 2, suburb.streets.size
149
+
150
+ suburb = Suburb.includes(:first_streets).find([2, 1])
151
+ assert_equal 1, suburb.first_streets.size
152
+ end
153
+
154
+ def test_composite_has_many_composites
155
+ room = rooms(:branner_room_1)
156
+ assert_equal(2, room.room_assignments.length)
157
+ assert_equal(room_assignments(:jacksons_room), room.room_assignments[0])
158
+ assert_equal(room_assignments(:bobs_room), room.room_assignments[1])
159
+ end
160
+
161
+ def test_composite_belongs_to_composite
162
+ room_assignment = room_assignments(:jacksons_room)
163
+ assert_equal(rooms(:branner_room_1), room_assignment.room)
164
+ end
165
+
166
+ def test_composite_belongs_to_changes
167
+ room_assignment = room_assignments(:jacksons_room)
168
+ room_assignment.room = rooms(:branner_room_2)
169
+ # This was raising an error before:
170
+ # TypeError: [:dorm_id, :room_id] is not a symbol
171
+ # changes returns HashWithIndifferentAccess
172
+ assert_equal({"room_id"=>[1, 2]}, room_assignment.changes)
173
+
174
+ steve = employees(:steve)
175
+ steve.department = departments(:engineering)
176
+ # It was returning this before:
177
+ # {"[:department_id, :location_id]"=>[nil, [2, 1]]}
178
+ assert_equal({"department_id"=>[1, 2]}, steve.changes)
179
+ end
180
+
181
+ def test_composite_belongs_to__setting_to_nil
182
+ room_assignment = room_assignments(:jacksons_room)
183
+ # This was raising an error before:
184
+ # NoMethodError: undefined method `length' for nil:NilClass
185
+ assert_nothing_raised { room_assignment.room = nil }
186
+ end
187
+
188
+ def test_has_one_with_composite
189
+ # In this case a regular model has_one composite model
190
+ department = departments(:engineering)
191
+ assert_not_nil(department.head)
192
+ end
193
+
194
+ def test_has_many_build__simple_key
195
+ user = users(:santiago)
196
+ reading = user.readings.build
197
+ assert_equal user.id, reading.user_id
198
+ assert_equal user, reading.user
199
+ end
200
+
201
+ def test_has_many_build__composite_key
202
+ department = departments(:engineering)
203
+ employee = department.employees.build
204
+ assert_equal department.department_id, employee.department_id
205
+ assert_equal department.location_id, employee.location_id
206
+ assert_equal department, employee.department
207
+ end
208
+
209
+ def test_has_many_with_primary_key
210
+ @membership = Membership.find([1, 1])
211
+ assert_equal 2, @membership.readings.size
212
+ end
213
+
214
+ def test_has_many_with_composite_key
215
+ # In this case a regular model (Dorm) has_many composite models (Rooms)
216
+ dorm = dorms(:branner)
217
+ assert_equal(3, dorm.rooms.length)
218
+ assert_equal(1, dorm.rooms[0].room_id)
219
+ assert_equal(2, dorm.rooms[1].room_id)
220
+ assert_equal(3, dorm.rooms[2].room_id)
221
+ end
222
+
223
+ def test_joins_has_many_with_primary_key
224
+ #@membership = Membership.find(:first, :joins => :readings, :conditions => { :readings => { :id => 1 } })
225
+ @membership = Membership.joins(:readings).where(readings: { id: 1 }).first
226
+
227
+ assert_equal [1, 1], @membership.id
228
+ end
229
+
230
+ def test_joins_has_one_with_primary_key
231
+ @membership = Membership.joins(:readings).where(readings: { id: 2 }).first
232
+
233
+ assert_equal [1, 1], @membership.id
234
+ end
235
+
236
+ def test_has_many_through_with_conditions_when_through_association_is_not_composite
237
+ user = User.first
238
+ assert_equal 1, user.articles.where("articles.name = ?", "Article One").size
239
+ end
240
+
241
+ def test_has_many_through_with_conditions_when_through_association_is_composite
242
+ room = Room.first
243
+ assert_equal 0, room.room_attributes.where("room_attributes.name != ?", "type").size
244
+ end
245
+
246
+ def test_has_many_through_on_custom_finder_when_through_association_is_composite_finder_when_through_association_is_not_composite
247
+ user = User.first
248
+ assert_equal(1, user.find_custom_articles.size)
249
+ end
250
+
251
+ def test_has_many_through_on_custom_finder_when_through_association_is_composite
252
+ room = Room.first
253
+ assert_equal(0, room.find_custom_room_attributes.size)
254
+ end
255
+
256
+ def test_has_many_with_primary_key_with_associations
257
+ memberships = Membership.includes(:statuses).where("membership_statuses.status = ?", 'Active').references(:membership_statuses)
258
+ assert_equal(2, memberships.length)
259
+ assert_equal([1,1], memberships[0].id)
260
+ assert_equal([3,2], memberships[1].id)
261
+ end
262
+
263
+ def test_limitable_reflections
264
+ memberships = Membership.includes(:statuses).where("membership_statuses.status = ?", 'Active').references(:membership_statuses).limit(1)
265
+ assert_equal(1, memberships.length)
266
+ assert_equal([1,1], memberships[0].id)
267
+ end
268
+
269
+ def test_foreign_key_present_with_null_association_ids
270
+ group = Group.new
271
+ group.memberships.build
272
+ associations = group.association_cache[:memberships]
273
+ assert_equal(false, associations.send('foreign_key_present?'))
274
+ end
275
+ end