store_base_sti_class 1.0.0 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +5 -5
  2. data/Appraisals +9 -50
  3. data/Gemfile.lock +25 -27
  4. data/LICENSE.txt +1 -1
  5. data/README.md +37 -10
  6. data/gemfiles/rails_5.0.7.gemfile +8 -0
  7. data/gemfiles/rails_5.1.7.gemfile +8 -0
  8. data/gemfiles/rails_5.2.3.gemfile +8 -0
  9. data/gemfiles/rails_5.2.4.gemfile +8 -0
  10. data/gemfiles/rails_6.0.3.gemfile +8 -0
  11. data/gemfiles/rails_6.1.0.gemfile +8 -0
  12. data/lib/store_base_sti_class.rb +9 -7
  13. data/lib/store_base_sti_class/version.rb +1 -1
  14. data/lib/store_base_sti_class_for_5_0.rb +16 -0
  15. data/lib/{store_base_sti_class_for_4_2.rb → store_base_sti_class_for_5_1.rb} +97 -90
  16. data/lib/store_base_sti_class_for_5_2.rb +176 -0
  17. data/lib/store_base_sti_class_for_6_0.rb +153 -0
  18. data/lib/store_base_sti_class_for_6_1.rb +156 -0
  19. data/store_base_sti_class.gemspec +1 -2
  20. metadata +17 -170
  21. data/debug.log +0 -53835
  22. data/gemfiles/rails_3.0.10.gemfile.lock +0 -45
  23. data/gemfiles/rails_3.0.11.gemfile.lock +0 -45
  24. data/gemfiles/rails_3.0.12.gemfile.lock +0 -45
  25. data/gemfiles/rails_3.0.13.gemfile.lock +0 -45
  26. data/gemfiles/rails_3.0.14.gemfile.lock +0 -45
  27. data/gemfiles/rails_3.0.15.gemfile.lock +0 -45
  28. data/gemfiles/rails_3.0.16.gemfile.lock +0 -45
  29. data/gemfiles/rails_3.0.17.gemfile.lock +0 -45
  30. data/gemfiles/rails_3.0.18.gemfile.lock +0 -45
  31. data/gemfiles/rails_3.0.19.gemfile.lock +0 -45
  32. data/gemfiles/rails_3.0.20.gemfile.lock +0 -45
  33. data/gemfiles/rails_3.0.5.gemfile.lock +0 -45
  34. data/gemfiles/rails_3.0.6.gemfile.lock +0 -45
  35. data/gemfiles/rails_3.0.7.gemfile.lock +0 -45
  36. data/gemfiles/rails_3.0.8.gemfile.lock +0 -45
  37. data/gemfiles/rails_3.0.9.gemfile.lock +0 -45
  38. data/gemfiles/rails_3.1.0.gemfile.lock +0 -49
  39. data/gemfiles/rails_3.1.10.gemfile.lock +0 -47
  40. data/gemfiles/rails_3.1.11.gemfile.lock +0 -47
  41. data/gemfiles/rails_3.1.12.gemfile.lock +0 -47
  42. data/gemfiles/rails_3.1.2.gemfile.lock +0 -47
  43. data/gemfiles/rails_3.1.3.gemfile.lock +0 -47
  44. data/gemfiles/rails_3.1.4.gemfile.lock +0 -47
  45. data/gemfiles/rails_3.1.5.gemfile.lock +0 -47
  46. data/gemfiles/rails_3.1.6.gemfile.lock +0 -47
  47. data/gemfiles/rails_3.1.7.gemfile.lock +0 -47
  48. data/gemfiles/rails_3.1.8.gemfile.lock +0 -47
  49. data/gemfiles/rails_3.1.9.gemfile.lock +0 -47
  50. data/gemfiles/rails_3.2.0.gemfile.lock +0 -47
  51. data/gemfiles/rails_3.2.1.gemfile.lock +0 -47
  52. data/gemfiles/rails_3.2.10.gemfile.lock +0 -47
  53. data/gemfiles/rails_3.2.11.gemfile.lock +0 -47
  54. data/gemfiles/rails_3.2.12.gemfile.lock +0 -47
  55. data/gemfiles/rails_3.2.13.gemfile.lock +0 -47
  56. data/gemfiles/rails_3.2.14.gemfile.lock +0 -44
  57. data/gemfiles/rails_3.2.15.gemfile.lock +0 -47
  58. data/gemfiles/rails_3.2.16.gemfile.lock +0 -47
  59. data/gemfiles/rails_3.2.17.gemfile.lock +0 -47
  60. data/gemfiles/rails_3.2.18.gemfile.lock +0 -47
  61. data/gemfiles/rails_3.2.19.gemfile.lock +0 -47
  62. data/gemfiles/rails_3.2.2.gemfile.lock +0 -47
  63. data/gemfiles/rails_3.2.20.gemfile.lock +0 -47
  64. data/gemfiles/rails_3.2.21.gemfile.lock +0 -47
  65. data/gemfiles/rails_3.2.22.gemfile.lock +0 -47
  66. data/gemfiles/rails_3.2.3.gemfile.lock +0 -47
  67. data/gemfiles/rails_3.2.4.gemfile.lock +0 -47
  68. data/gemfiles/rails_3.2.5.gemfile.lock +0 -47
  69. data/gemfiles/rails_3.2.6.gemfile.lock +0 -47
  70. data/gemfiles/rails_3.2.7.gemfile.lock +0 -47
  71. data/gemfiles/rails_3.2.8.gemfile.lock +0 -47
  72. data/gemfiles/rails_3.2.9.gemfile.lock +0 -47
  73. data/gemfiles/rails_4.0.0.gemfile +0 -7
  74. data/gemfiles/rails_4.0.0.gemfile.lock +0 -49
  75. data/gemfiles/rails_4.0.1.gemfile +0 -7
  76. data/gemfiles/rails_4.0.1.gemfile.lock +0 -49
  77. data/gemfiles/rails_4.0.10.gemfile +0 -7
  78. data/gemfiles/rails_4.0.10.gemfile.lock +0 -49
  79. data/gemfiles/rails_4.0.11.1.gemfile +0 -7
  80. data/gemfiles/rails_4.0.11.1.gemfile.lock +0 -49
  81. data/gemfiles/rails_4.0.11.gemfile +0 -7
  82. data/gemfiles/rails_4.0.11.gemfile.lock +0 -49
  83. data/gemfiles/rails_4.0.12.gemfile +0 -7
  84. data/gemfiles/rails_4.0.12.gemfile.lock +0 -49
  85. data/gemfiles/rails_4.0.13.gemfile +0 -7
  86. data/gemfiles/rails_4.0.13.gemfile.lock +0 -49
  87. data/gemfiles/rails_4.0.2.gemfile +0 -7
  88. data/gemfiles/rails_4.0.2.gemfile.lock +0 -49
  89. data/gemfiles/rails_4.0.3.gemfile +0 -7
  90. data/gemfiles/rails_4.0.3.gemfile.lock +0 -49
  91. data/gemfiles/rails_4.0.4.gemfile +0 -7
  92. data/gemfiles/rails_4.0.4.gemfile.lock +0 -49
  93. data/gemfiles/rails_4.0.5.gemfile +0 -7
  94. data/gemfiles/rails_4.0.5.gemfile.lock +0 -49
  95. data/gemfiles/rails_4.0.6.gemfile +0 -7
  96. data/gemfiles/rails_4.0.6.gemfile.lock +0 -49
  97. data/gemfiles/rails_4.0.7.gemfile +0 -7
  98. data/gemfiles/rails_4.0.7.gemfile.lock +0 -49
  99. data/gemfiles/rails_4.0.8.gemfile +0 -7
  100. data/gemfiles/rails_4.0.8.gemfile.lock +0 -49
  101. data/gemfiles/rails_4.0.9.gemfile +0 -7
  102. data/gemfiles/rails_4.0.9.gemfile.lock +0 -49
  103. data/gemfiles/rails_4.1.0.gemfile +0 -7
  104. data/gemfiles/rails_4.1.0.gemfile.lock +0 -48
  105. data/gemfiles/rails_4.1.1.gemfile +0 -7
  106. data/gemfiles/rails_4.1.1.gemfile.lock +0 -48
  107. data/gemfiles/rails_4.1.10.gemfile +0 -7
  108. data/gemfiles/rails_4.1.10.gemfile.lock +0 -48
  109. data/gemfiles/rails_4.1.11.gemfile +0 -7
  110. data/gemfiles/rails_4.1.11.gemfile.lock +0 -48
  111. data/gemfiles/rails_4.1.12.gemfile +0 -7
  112. data/gemfiles/rails_4.1.12.gemfile.lock +0 -48
  113. data/gemfiles/rails_4.1.13.gemfile +0 -7
  114. data/gemfiles/rails_4.1.13.gemfile.lock +0 -48
  115. data/gemfiles/rails_4.1.14.1.gemfile +0 -7
  116. data/gemfiles/rails_4.1.14.1.gemfile.lock +0 -48
  117. data/gemfiles/rails_4.1.14.2.gemfile +0 -7
  118. data/gemfiles/rails_4.1.14.2.gemfile.lock +0 -48
  119. data/gemfiles/rails_4.1.14.gemfile +0 -7
  120. data/gemfiles/rails_4.1.14.gemfile.lock +0 -48
  121. data/gemfiles/rails_4.1.15.gemfile +0 -7
  122. data/gemfiles/rails_4.1.15.gemfile.lock +0 -48
  123. data/gemfiles/rails_4.1.2.gemfile +0 -7
  124. data/gemfiles/rails_4.1.2.gemfile.lock +0 -48
  125. data/gemfiles/rails_4.1.3.gemfile +0 -7
  126. data/gemfiles/rails_4.1.3.gemfile.lock +0 -48
  127. data/gemfiles/rails_4.1.4.gemfile +0 -7
  128. data/gemfiles/rails_4.1.4.gemfile.lock +0 -48
  129. data/gemfiles/rails_4.1.5.gemfile +0 -7
  130. data/gemfiles/rails_4.1.5.gemfile.lock +0 -48
  131. data/gemfiles/rails_4.1.6.gemfile +0 -7
  132. data/gemfiles/rails_4.1.6.gemfile.lock +0 -48
  133. data/gemfiles/rails_4.1.7.1.gemfile +0 -7
  134. data/gemfiles/rails_4.1.7.1.gemfile.lock +0 -48
  135. data/gemfiles/rails_4.1.7.gemfile +0 -7
  136. data/gemfiles/rails_4.1.7.gemfile.lock +0 -48
  137. data/gemfiles/rails_4.1.8.gemfile +0 -7
  138. data/gemfiles/rails_4.1.8.gemfile.lock +0 -48
  139. data/gemfiles/rails_4.1.9.gemfile +0 -7
  140. data/gemfiles/rails_4.1.9.gemfile.lock +0 -48
  141. data/gemfiles/rails_4.2.0.gemfile +0 -7
  142. data/gemfiles/rails_4.2.0.gemfile.lock +0 -48
  143. data/gemfiles/rails_4.2.1.gemfile +0 -7
  144. data/gemfiles/rails_4.2.1.gemfile.lock +0 -48
  145. data/gemfiles/rails_4.2.2.gemfile +0 -7
  146. data/gemfiles/rails_4.2.2.gemfile.lock +0 -48
  147. data/gemfiles/rails_4.2.3.gemfile +0 -7
  148. data/gemfiles/rails_4.2.3.gemfile.lock +0 -48
  149. data/gemfiles/rails_4.2.4.gemfile +0 -7
  150. data/gemfiles/rails_4.2.4.gemfile.lock +0 -48
  151. data/gemfiles/rails_4.2.5.1.gemfile +0 -7
  152. data/gemfiles/rails_4.2.5.1.gemfile.lock +0 -48
  153. data/gemfiles/rails_4.2.5.2.gemfile +0 -7
  154. data/gemfiles/rails_4.2.5.2.gemfile.lock +0 -48
  155. data/gemfiles/rails_4.2.5.gemfile +0 -7
  156. data/gemfiles/rails_4.2.5.gemfile.lock +0 -48
  157. data/gemfiles/rails_4.2.6.gemfile +0 -7
  158. data/gemfiles/rails_4.2.6.gemfile.lock +0 -48
  159. data/gemfiles/rails_4.2.7.1.gemfile +0 -7
  160. data/gemfiles/rails_4.2.7.gemfile +0 -7
  161. data/gemfiles/rails_5.0.0.1.gemfile +0 -7
  162. data/gemfiles/rails_5.0.0.gemfile +0 -7
  163. data/gemfiles/rails_5.0.1.gemfile +0 -7
  164. data/gemfiles/rails_5.0.1.gemfile.lock +0 -48
  165. data/lib/store_base_sti_class_for_4_0.rb +0 -337
  166. data/lib/store_base_sti_class_for_4_1.rb +0 -360
  167. data/storebasestiname_unittest.sql +0 -0
@@ -0,0 +1,176 @@
1
+ require 'active_record/associations/join_dependency/join_part'
2
+
3
+ if ActiveRecord::VERSION::STRING =~ /^5\.2/
4
+ module ActiveRecord
5
+
6
+ class Base
7
+ class_attribute :store_base_sti_class
8
+ self.store_base_sti_class = true
9
+ end
10
+
11
+ module Inheritance
12
+ module ClassMethods
13
+ def polymorphic_name
14
+ ActiveRecord::Base.store_base_sti_class ? base_class.name : name
15
+ end
16
+ end
17
+ end
18
+
19
+ module Associations
20
+ class Preloader
21
+ class ThroughAssociation < Association
22
+ private
23
+
24
+ def through_scope
25
+ scope = through_reflection.klass.unscoped
26
+ options = reflection.options
27
+
28
+ if options[:source_type]
29
+
30
+ # BEGIN PATCH
31
+ # original:
32
+ # scope.where! reflection.foreign_type => options[:source_type]
33
+
34
+ adjusted_foreign_type =
35
+ if ActiveRecord::Base.store_base_sti_class
36
+ options[:source_type]
37
+ else
38
+ ([options[:source_type].constantize] + options[:source_type].constantize.descendants).map(&:to_s)
39
+ end
40
+
41
+ scope.where! reflection.foreign_type => adjusted_foreign_type
42
+ # END PATCH
43
+
44
+ elsif !reflection_scope.where_clause.empty?
45
+ scope.where_clause = reflection_scope.where_clause
46
+ values = reflection_scope.values
47
+
48
+ if includes = values[:includes]
49
+ scope.includes!(source_reflection.name => includes)
50
+ else
51
+ scope.includes!(source_reflection.name)
52
+ end
53
+
54
+ if values[:references] && !values[:references].empty?
55
+ scope.references!(values[:references])
56
+ else
57
+ scope.references!(source_reflection.table_name)
58
+ end
59
+
60
+ if joins = values[:joins]
61
+ scope.joins!(source_reflection.name => joins)
62
+ end
63
+
64
+ if left_outer_joins = values[:left_outer_joins]
65
+ scope.left_outer_joins!(source_reflection.name => left_outer_joins)
66
+ end
67
+
68
+ if scope.eager_loading? && order_values = values[:order]
69
+ scope = scope.order(order_values)
70
+ end
71
+ end
72
+
73
+ scope unless scope.empty_scope?
74
+ end
75
+ end
76
+ end
77
+
78
+ class AssociationScope
79
+ private
80
+
81
+ def next_chain_scope(scope, reflection, next_reflection)
82
+ join_keys = reflection.join_keys
83
+ key = join_keys.key
84
+ foreign_key = join_keys.foreign_key
85
+
86
+ table = reflection.aliased_table
87
+ foreign_table = next_reflection.aliased_table
88
+ constraint = table[key].eq(foreign_table[foreign_key])
89
+
90
+ if reflection.type
91
+ # BEGIN PATCH
92
+ # original:
93
+ # value = transform_value(next_reflection.klass.polymorphic_name)
94
+ # scope = apply_scope(scope, table, reflection.type, value)
95
+ if ActiveRecord::Base.store_base_sti_class
96
+ value = transform_value(next_reflection.klass.polymorphic_name)
97
+ else
98
+ klass = next_reflection.klass
99
+ value = ([klass] + klass.descendants).map(&:name)
100
+ end
101
+ scope = apply_scope(scope, table, reflection.type, value)
102
+ # END PATCH
103
+ end
104
+
105
+ scope.joins!(join(foreign_table, constraint))
106
+ end
107
+
108
+ end
109
+
110
+ class HasManyThroughAssociation
111
+ private
112
+
113
+ if ActiveRecord::VERSION::STRING =~ /^5\.2\.4/
114
+ def build_through_record(record)
115
+ @through_records[record.object_id] ||= begin
116
+ ensure_mutable
117
+
118
+ attributes = through_scope_attributes
119
+ attributes[source_reflection.name] = record
120
+
121
+ # START PATCH
122
+ if ActiveRecord::Base.store_base_sti_class
123
+ if options[:source_type]
124
+ attributes[source_reflection.foreign_type] = options[:source_type]
125
+ end
126
+ end
127
+ # END PATCH
128
+
129
+ through_association.build(attributes)
130
+ end
131
+ end
132
+ else
133
+ def build_through_record(record)
134
+ @through_records[record.object_id] ||= begin
135
+ ensure_mutable
136
+
137
+ through_record = through_association.build(*options_for_through_record)
138
+ through_record.send("#{source_reflection.name}=", record)
139
+
140
+ # START PATCH
141
+ if ActiveRecord::Base.store_base_sti_class
142
+ if options[:source_type]
143
+ through_record.send("#{source_reflection.foreign_type}=", options[:source_type])
144
+ end
145
+ end
146
+ # END PATCH
147
+
148
+ through_record
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
154
+
155
+ module Reflection
156
+ class PolymorphicReflection
157
+ def source_type_scope
158
+ type = @previous_reflection.foreign_type
159
+ source_type = @previous_reflection.options[:source_type]
160
+
161
+ # START PATCH
162
+ adjusted_source_type =
163
+ if ActiveRecord::Base.store_base_sti_class
164
+ source_type
165
+ else
166
+ ([source_type.constantize] + source_type.constantize.descendants).map(&:to_s)
167
+ end
168
+ # END PATCH
169
+
170
+ lambda { |object| where(type => adjusted_source_type) }
171
+ end
172
+ end
173
+ end
174
+ end
175
+
176
+ end
@@ -0,0 +1,153 @@
1
+ require 'active_record/associations/join_dependency/join_part'
2
+
3
+ if ActiveRecord::VERSION::STRING =~ /^6\.0/
4
+ module ActiveRecord
5
+
6
+ class Base
7
+ class_attribute :store_base_sti_class
8
+ self.store_base_sti_class = true
9
+ end
10
+
11
+ module Inheritance
12
+ module ClassMethods
13
+ def polymorphic_name
14
+ ActiveRecord::Base.store_base_sti_class ? base_class.name : name
15
+ end
16
+ end
17
+ end
18
+
19
+ module Associations
20
+ class Preloader
21
+ class ThroughAssociation < Association
22
+ private
23
+
24
+ def through_scope
25
+ scope = through_reflection.klass.unscoped
26
+ options = reflection.options
27
+
28
+ if options[:source_type]
29
+
30
+ # BEGIN PATCH
31
+ # original:
32
+ # scope.where! reflection.foreign_type => options[:source_type]
33
+
34
+ adjusted_foreign_type =
35
+ if ActiveRecord::Base.store_base_sti_class
36
+ options[:source_type]
37
+ else
38
+ ([options[:source_type].constantize] + options[:source_type].constantize.descendants).map(&:to_s)
39
+ end
40
+
41
+ scope.where! reflection.foreign_type => adjusted_foreign_type
42
+ # END PATCH
43
+
44
+ elsif !reflection_scope.where_clause.empty?
45
+ scope.where_clause = reflection_scope.where_clause
46
+ values = reflection_scope.values
47
+
48
+ if includes = values[:includes]
49
+ scope.includes!(source_reflection.name => includes)
50
+ else
51
+ scope.includes!(source_reflection.name)
52
+ end
53
+
54
+ if values[:references] && !values[:references].empty?
55
+ scope.references!(values[:references])
56
+ else
57
+ scope.references!(source_reflection.table_name)
58
+ end
59
+
60
+ if joins = values[:joins]
61
+ scope.joins!(source_reflection.name => joins)
62
+ end
63
+
64
+ if left_outer_joins = values[:left_outer_joins]
65
+ scope.left_outer_joins!(source_reflection.name => left_outer_joins)
66
+ end
67
+
68
+ if scope.eager_loading? && order_values = values[:order]
69
+ scope = scope.order(order_values)
70
+ end
71
+ end
72
+
73
+ scope unless scope.empty_scope?
74
+ end
75
+ end
76
+ end
77
+
78
+ class AssociationScope
79
+ private
80
+
81
+ def next_chain_scope(scope, reflection, next_reflection)
82
+ join_keys = reflection.join_keys
83
+ key = join_keys.key
84
+ foreign_key = join_keys.foreign_key
85
+
86
+ table = reflection.aliased_table
87
+ foreign_table = next_reflection.aliased_table
88
+ constraint = table[key].eq(foreign_table[foreign_key])
89
+
90
+ if reflection.type
91
+ # BEGIN PATCH
92
+ # original:
93
+ # value = transform_value(next_reflection.klass.polymorphic_name)
94
+ # scope = apply_scope(scope, table, reflection.type, value)
95
+ if ActiveRecord::Base.store_base_sti_class
96
+ value = transform_value(next_reflection.klass.polymorphic_name)
97
+ else
98
+ klass = next_reflection.klass
99
+ value = ([klass] + klass.descendants).map(&:name)
100
+ end
101
+ scope = apply_scope(scope, table, reflection.type, value)
102
+ # END PATCH
103
+ end
104
+
105
+ scope.joins!(join(foreign_table, constraint))
106
+ end
107
+
108
+ end
109
+
110
+ class HasManyThroughAssociation
111
+ private
112
+
113
+ def build_through_record(record)
114
+ @through_records[record.object_id] ||= begin
115
+ ensure_mutable
116
+
117
+ attributes = through_scope_attributes
118
+ attributes[source_reflection.name] = record
119
+
120
+ # START PATCH
121
+ if ActiveRecord::Base.store_base_sti_class
122
+ attributes[source_reflection.foreign_type] = options[:source_type] if options[:source_type]
123
+ end
124
+ # END PATCH
125
+
126
+ through_association.build(attributes)
127
+ end
128
+ end
129
+ end
130
+ end
131
+
132
+ module Reflection
133
+ class PolymorphicReflection
134
+ def source_type_scope
135
+ type = @previous_reflection.foreign_type
136
+ source_type = @previous_reflection.options[:source_type]
137
+
138
+ # START PATCH
139
+ adjusted_source_type =
140
+ if ActiveRecord::Base.store_base_sti_class
141
+ source_type
142
+ else
143
+ ([source_type.constantize] + source_type.constantize.descendants).map(&:to_s)
144
+ end
145
+ # END PATCH
146
+
147
+ lambda { |object| where(type => adjusted_source_type) }
148
+ end
149
+ end
150
+ end
151
+ end
152
+
153
+ end
@@ -0,0 +1,156 @@
1
+ require 'active_record/associations/join_dependency/join_part'
2
+
3
+ if ActiveRecord::VERSION::STRING =~ /^6\.1/
4
+ module ActiveRecord
5
+
6
+ class Base
7
+ class_attribute :store_base_sti_class
8
+ self.store_base_sti_class = true
9
+ end
10
+
11
+ module Inheritance
12
+ module ClassMethods
13
+ def polymorphic_name
14
+ ActiveRecord::Base.store_base_sti_class ? base_class.name : name
15
+ end
16
+ end
17
+ end
18
+
19
+ module Associations
20
+ class Preloader
21
+ class ThroughAssociation < Association
22
+ private
23
+
24
+ def through_scope
25
+ scope = through_reflection.klass.unscoped
26
+ options = reflection.options
27
+
28
+ values = reflection_scope.values
29
+ if annotations = values[:annotate]
30
+ scope.annotate!(*annotations)
31
+ end
32
+
33
+ if options[:source_type]
34
+ # BEGIN PATCH
35
+ # original:
36
+ # scope.where! reflection.foreign_type => options[:source_type]
37
+
38
+ adjusted_foreign_type =
39
+ if ActiveRecord::Base.store_base_sti_class
40
+ options[:source_type]
41
+ else
42
+ ([options[:source_type].constantize] + options[:source_type].constantize.descendants).map(&:to_s)
43
+ end
44
+
45
+ scope.where! reflection.foreign_type => adjusted_foreign_type
46
+ # END PATCH
47
+
48
+ elsif !reflection_scope.where_clause.empty?
49
+ scope.where_clause = reflection_scope.where_clause
50
+
51
+ if includes = values[:includes]
52
+ scope.includes!(source_reflection.name => includes)
53
+ else
54
+ scope.includes!(source_reflection.name)
55
+ end
56
+
57
+ if values[:references] && !values[:references].empty?
58
+ scope.references_values |= values[:references]
59
+ else
60
+ scope.references!(source_reflection.table_name)
61
+ end
62
+
63
+ if joins = values[:joins]
64
+ scope.joins!(source_reflection.name => joins)
65
+ end
66
+
67
+ if left_outer_joins = values[:left_outer_joins]
68
+ scope.left_outer_joins!(source_reflection.name => left_outer_joins)
69
+ end
70
+
71
+ if scope.eager_loading? && order_values = values[:order]
72
+ scope = scope.order(order_values)
73
+ end
74
+ end
75
+
76
+ scope
77
+ end
78
+ end
79
+ end
80
+
81
+ class AssociationScope
82
+ private
83
+
84
+ def next_chain_scope(scope, reflection, next_reflection)
85
+ primary_key = reflection.join_primary_key
86
+ foreign_key = reflection.join_foreign_key
87
+
88
+ table = reflection.aliased_table
89
+ foreign_table = next_reflection.aliased_table
90
+ constraint = table[primary_key].eq(foreign_table[foreign_key])
91
+
92
+ if reflection.type
93
+ # BEGIN PATCH
94
+ # original:
95
+ # value = transform_value(next_reflection.klass.polymorphic_name)
96
+ # scope = apply_scope(scope, table, reflection.type, value)
97
+
98
+ if ActiveRecord::Base.store_base_sti_class
99
+ value = transform_value(next_reflection.klass.polymorphic_name)
100
+ else
101
+ klass = next_reflection.klass
102
+ value = ([klass] + klass.descendants).map(&:name)
103
+ end
104
+ scope = apply_scope(scope, table, reflection.type, value)
105
+ # END PATCH
106
+ end
107
+
108
+ scope.joins!(join(foreign_table, constraint))
109
+ end
110
+
111
+ end
112
+
113
+ class HasManyThroughAssociation
114
+ private
115
+
116
+ def build_through_record(record)
117
+ @through_records[record.object_id] ||= begin
118
+ ensure_mutable
119
+
120
+ attributes = through_scope_attributes
121
+ attributes[source_reflection.name] = record
122
+
123
+ # START PATCH
124
+ if ActiveRecord::Base.store_base_sti_class
125
+ attributes[source_reflection.foreign_type] = options[:source_type] if options[:source_type]
126
+ end
127
+ # END PATCH
128
+
129
+ through_association.build(attributes)
130
+ end
131
+ end
132
+ end
133
+ end
134
+
135
+ module Reflection
136
+ class PolymorphicReflection
137
+ def source_type_scope
138
+ type = @previous_reflection.foreign_type
139
+ source_type = @previous_reflection.options[:source_type]
140
+
141
+ # START PATCH
142
+ adjusted_source_type =
143
+ if ActiveRecord::Base.store_base_sti_class
144
+ source_type
145
+ else
146
+ ([source_type.constantize] + source_type.constantize.descendants).map(&:to_s)
147
+ end
148
+ # END PATCH
149
+
150
+ lambda { |object| where(type => adjusted_source_type) }
151
+ end
152
+ end
153
+ end
154
+ end
155
+
156
+ end