activerecord 5.1.7 → 5.2.4.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


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

Files changed (261) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +556 -685
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +5 -5
  5. data/examples/performance.rb +2 -0
  6. data/examples/simple.rb +2 -0
  7. data/lib/active_record.rb +11 -4
  8. data/lib/active_record/aggregations.rb +6 -5
  9. data/lib/active_record/association_relation.rb +7 -5
  10. data/lib/active_record/associations.rb +40 -63
  11. data/lib/active_record/associations/alias_tracker.rb +19 -27
  12. data/lib/active_record/associations/association.rb +41 -37
  13. data/lib/active_record/associations/association_scope.rb +38 -50
  14. data/lib/active_record/associations/belongs_to_association.rb +27 -8
  15. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -8
  16. data/lib/active_record/associations/builder/association.rb +4 -7
  17. data/lib/active_record/associations/builder/belongs_to.rb +12 -4
  18. data/lib/active_record/associations/builder/collection_association.rb +3 -3
  19. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -1
  20. data/lib/active_record/associations/builder/has_many.rb +2 -0
  21. data/lib/active_record/associations/builder/has_one.rb +2 -0
  22. data/lib/active_record/associations/builder/singular_association.rb +2 -0
  23. data/lib/active_record/associations/collection_association.rb +59 -47
  24. data/lib/active_record/associations/collection_proxy.rb +20 -49
  25. data/lib/active_record/associations/foreign_association.rb +2 -0
  26. data/lib/active_record/associations/has_many_association.rb +12 -1
  27. data/lib/active_record/associations/has_many_through_association.rb +36 -30
  28. data/lib/active_record/associations/has_one_association.rb +12 -1
  29. data/lib/active_record/associations/has_one_through_association.rb +13 -8
  30. data/lib/active_record/associations/join_dependency.rb +48 -93
  31. data/lib/active_record/associations/join_dependency/join_association.rb +39 -63
  32. data/lib/active_record/associations/join_dependency/join_base.rb +9 -8
  33. data/lib/active_record/associations/join_dependency/join_part.rb +9 -9
  34. data/lib/active_record/associations/preloader.rb +18 -38
  35. data/lib/active_record/associations/preloader/association.rb +45 -61
  36. data/lib/active_record/associations/preloader/through_association.rb +71 -79
  37. data/lib/active_record/associations/singular_association.rb +14 -16
  38. data/lib/active_record/associations/through_association.rb +26 -11
  39. data/lib/active_record/attribute_assignment.rb +2 -5
  40. data/lib/active_record/attribute_decorators.rb +3 -2
  41. data/lib/active_record/attribute_methods.rb +65 -24
  42. data/lib/active_record/attribute_methods/before_type_cast.rb +2 -0
  43. data/lib/active_record/attribute_methods/dirty.rb +30 -214
  44. data/lib/active_record/attribute_methods/primary_key.rb +7 -6
  45. data/lib/active_record/attribute_methods/query.rb +2 -0
  46. data/lib/active_record/attribute_methods/read.rb +9 -3
  47. data/lib/active_record/attribute_methods/serialization.rb +23 -0
  48. data/lib/active_record/attribute_methods/time_zone_conversion.rb +6 -8
  49. data/lib/active_record/attribute_methods/write.rb +21 -9
  50. data/lib/active_record/attributes.rb +6 -5
  51. data/lib/active_record/autosave_association.rb +35 -19
  52. data/lib/active_record/base.rb +2 -0
  53. data/lib/active_record/callbacks.rb +8 -6
  54. data/lib/active_record/coders/json.rb +2 -0
  55. data/lib/active_record/coders/yaml_column.rb +2 -0
  56. data/lib/active_record/collection_cache_key.rb +12 -8
  57. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +139 -41
  58. data/lib/active_record/connection_adapters/abstract/database_limits.rb +7 -0
  59. data/lib/active_record/connection_adapters/abstract/database_statements.rb +174 -33
  60. data/lib/active_record/connection_adapters/abstract/query_cache.rb +15 -5
  61. data/lib/active_record/connection_adapters/abstract/quoting.rb +13 -31
  62. data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
  63. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +14 -5
  64. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +64 -6
  65. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +31 -53
  66. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +152 -81
  67. data/lib/active_record/connection_adapters/abstract/transaction.rb +66 -21
  68. data/lib/active_record/connection_adapters/abstract_adapter.rb +84 -97
  69. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +92 -165
  70. data/lib/active_record/connection_adapters/column.rb +3 -1
  71. data/lib/active_record/connection_adapters/connection_specification.rb +17 -3
  72. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +13 -2
  73. data/lib/active_record/connection_adapters/mysql/column.rb +2 -0
  74. data/lib/active_record/connection_adapters/mysql/database_statements.rb +47 -2
  75. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +2 -0
  76. data/lib/active_record/connection_adapters/mysql/quoting.rb +9 -10
  77. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +5 -3
  78. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +7 -10
  79. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +30 -30
  80. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +106 -1
  81. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +2 -0
  82. data/lib/active_record/connection_adapters/mysql2_adapter.rb +8 -2
  83. data/lib/active_record/connection_adapters/postgresql/column.rb +2 -0
  84. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +6 -0
  85. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +2 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid.rb +3 -1
  87. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +2 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +2 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +2 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  93. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +2 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +2 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +2 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -1
  99. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -1
  101. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +2 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +4 -2
  104. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +2 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +4 -2
  106. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +3 -1
  107. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  108. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  109. data/lib/active_record/connection_adapters/postgresql/quoting.rb +18 -0
  110. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +19 -25
  111. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +50 -0
  112. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +24 -11
  113. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +20 -13
  114. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +233 -111
  115. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +2 -0
  116. data/lib/active_record/connection_adapters/postgresql/utils.rb +3 -1
  117. data/lib/active_record/connection_adapters/postgresql_adapter.rb +57 -73
  118. data/lib/active_record/connection_adapters/schema_cache.rb +4 -2
  119. data/lib/active_record/connection_adapters/sql_type_metadata.rb +2 -0
  120. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +2 -0
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +22 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +2 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +6 -15
  124. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +3 -2
  125. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +75 -1
  126. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +81 -94
  127. data/lib/active_record/connection_adapters/statement_pool.rb +2 -0
  128. data/lib/active_record/connection_handling.rb +4 -2
  129. data/lib/active_record/core.rb +41 -61
  130. data/lib/active_record/counter_cache.rb +10 -3
  131. data/lib/active_record/define_callbacks.rb +5 -3
  132. data/lib/active_record/dynamic_matchers.rb +9 -9
  133. data/lib/active_record/enum.rb +18 -13
  134. data/lib/active_record/errors.rb +42 -3
  135. data/lib/active_record/explain.rb +3 -1
  136. data/lib/active_record/explain_registry.rb +2 -0
  137. data/lib/active_record/explain_subscriber.rb +2 -0
  138. data/lib/active_record/fixture_set/file.rb +2 -0
  139. data/lib/active_record/fixtures.rb +67 -60
  140. data/lib/active_record/gem_version.rb +5 -3
  141. data/lib/active_record/inheritance.rb +49 -19
  142. data/lib/active_record/integration.rb +58 -19
  143. data/lib/active_record/internal_metadata.rb +2 -0
  144. data/lib/active_record/legacy_yaml_adapter.rb +3 -1
  145. data/lib/active_record/locking/optimistic.rb +14 -17
  146. data/lib/active_record/locking/pessimistic.rb +9 -6
  147. data/lib/active_record/log_subscriber.rb +43 -0
  148. data/lib/active_record/migration.rb +189 -139
  149. data/lib/active_record/migration/command_recorder.rb +11 -9
  150. data/lib/active_record/migration/compatibility.rb +47 -9
  151. data/lib/active_record/migration/join_table.rb +2 -0
  152. data/lib/active_record/model_schema.rb +16 -21
  153. data/lib/active_record/nested_attributes.rb +18 -6
  154. data/lib/active_record/no_touching.rb +3 -1
  155. data/lib/active_record/null_relation.rb +2 -0
  156. data/lib/active_record/persistence.rb +167 -16
  157. data/lib/active_record/query_cache.rb +6 -8
  158. data/lib/active_record/querying.rb +4 -2
  159. data/lib/active_record/railtie.rb +62 -6
  160. data/lib/active_record/railties/console_sandbox.rb +2 -0
  161. data/lib/active_record/railties/controller_runtime.rb +2 -0
  162. data/lib/active_record/railties/databases.rake +46 -36
  163. data/lib/active_record/readonly_attributes.rb +3 -2
  164. data/lib/active_record/reflection.rb +108 -194
  165. data/lib/active_record/relation.rb +120 -214
  166. data/lib/active_record/relation/batches.rb +20 -5
  167. data/lib/active_record/relation/batches/batch_enumerator.rb +2 -0
  168. data/lib/active_record/relation/calculations.rb +45 -19
  169. data/lib/active_record/relation/delegation.rb +45 -27
  170. data/lib/active_record/relation/finder_methods.rb +75 -76
  171. data/lib/active_record/relation/from_clause.rb +2 -8
  172. data/lib/active_record/relation/merger.rb +53 -23
  173. data/lib/active_record/relation/predicate_builder.rb +60 -79
  174. data/lib/active_record/relation/predicate_builder/array_handler.rb +10 -7
  175. data/lib/active_record/relation/predicate_builder/association_query_value.rb +46 -0
  176. data/lib/active_record/relation/predicate_builder/base_handler.rb +2 -2
  177. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +12 -1
  178. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +56 -0
  179. data/lib/active_record/relation/predicate_builder/range_handler.rb +26 -9
  180. data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
  181. data/lib/active_record/relation/query_attribute.rb +28 -2
  182. data/lib/active_record/relation/query_methods.rb +128 -99
  183. data/lib/active_record/relation/record_fetch_warning.rb +2 -0
  184. data/lib/active_record/relation/spawn_methods.rb +4 -2
  185. data/lib/active_record/relation/where_clause.rb +65 -68
  186. data/lib/active_record/relation/where_clause_factory.rb +5 -48
  187. data/lib/active_record/result.rb +2 -0
  188. data/lib/active_record/runtime_registry.rb +2 -0
  189. data/lib/active_record/sanitization.rb +129 -121
  190. data/lib/active_record/schema.rb +4 -2
  191. data/lib/active_record/schema_dumper.rb +36 -26
  192. data/lib/active_record/schema_migration.rb +2 -0
  193. data/lib/active_record/scoping.rb +9 -8
  194. data/lib/active_record/scoping/default.rb +8 -9
  195. data/lib/active_record/scoping/named.rb +23 -7
  196. data/lib/active_record/secure_token.rb +2 -0
  197. data/lib/active_record/serialization.rb +2 -0
  198. data/lib/active_record/statement_cache.rb +23 -13
  199. data/lib/active_record/store.rb +3 -1
  200. data/lib/active_record/suppressor.rb +2 -0
  201. data/lib/active_record/table_metadata.rb +12 -3
  202. data/lib/active_record/tasks/database_tasks.rb +25 -14
  203. data/lib/active_record/tasks/mysql_database_tasks.rb +9 -48
  204. data/lib/active_record/tasks/postgresql_database_tasks.rb +10 -2
  205. data/lib/active_record/tasks/sqlite_database_tasks.rb +25 -3
  206. data/lib/active_record/timestamp.rb +6 -6
  207. data/lib/active_record/touch_later.rb +2 -0
  208. data/lib/active_record/transactions.rb +33 -28
  209. data/lib/active_record/translation.rb +2 -0
  210. data/lib/active_record/type.rb +4 -1
  211. data/lib/active_record/type/adapter_specific_registry.rb +2 -0
  212. data/lib/active_record/type/date.rb +2 -0
  213. data/lib/active_record/type/date_time.rb +2 -0
  214. data/lib/active_record/type/decimal_without_scale.rb +2 -0
  215. data/lib/active_record/type/hash_lookup_type_map.rb +2 -0
  216. data/lib/active_record/type/internal/timezone.rb +2 -0
  217. data/lib/active_record/type/json.rb +30 -0
  218. data/lib/active_record/type/serialized.rb +2 -0
  219. data/lib/active_record/type/text.rb +2 -0
  220. data/lib/active_record/type/time.rb +2 -0
  221. data/lib/active_record/type/type_map.rb +2 -0
  222. data/lib/active_record/type/unsigned_integer.rb +2 -0
  223. data/lib/active_record/type_caster.rb +2 -0
  224. data/lib/active_record/type_caster/connection.rb +2 -0
  225. data/lib/active_record/type_caster/map.rb +3 -1
  226. data/lib/active_record/validations.rb +2 -0
  227. data/lib/active_record/validations/absence.rb +2 -0
  228. data/lib/active_record/validations/associated.rb +2 -0
  229. data/lib/active_record/validations/length.rb +2 -0
  230. data/lib/active_record/validations/presence.rb +2 -0
  231. data/lib/active_record/validations/uniqueness.rb +35 -5
  232. data/lib/active_record/version.rb +2 -0
  233. data/lib/rails/generators/active_record.rb +3 -1
  234. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  235. data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
  236. data/lib/rails/generators/active_record/migration.rb +2 -0
  237. data/lib/rails/generators/active_record/migration/migration_generator.rb +3 -1
  238. data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +0 -0
  239. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +0 -0
  240. data/lib/rails/generators/active_record/model/model_generator.rb +2 -23
  241. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +0 -0
  242. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  243. metadata +23 -36
  244. data/lib/active_record/associations/preloader/belongs_to.rb +0 -15
  245. data/lib/active_record/associations/preloader/collection_association.rb +0 -17
  246. data/lib/active_record/associations/preloader/has_many.rb +0 -15
  247. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  248. data/lib/active_record/associations/preloader/has_one.rb +0 -15
  249. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  250. data/lib/active_record/associations/preloader/singular_association.rb +0 -18
  251. data/lib/active_record/attribute.rb +0 -240
  252. data/lib/active_record/attribute/user_provided_default.rb +0 -30
  253. data/lib/active_record/attribute_mutation_tracker.rb +0 -122
  254. data/lib/active_record/attribute_set.rb +0 -113
  255. data/lib/active_record/attribute_set/builder.rb +0 -126
  256. data/lib/active_record/attribute_set/yaml_encoder.rb +0 -41
  257. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -10
  258. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  259. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  260. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -59
  261. data/lib/active_record/type/internal/abstract_json.rb +0 -37
@@ -1,113 +0,0 @@
1
- require "active_record/attribute_set/builder"
2
- require "active_record/attribute_set/yaml_encoder"
3
-
4
- module ActiveRecord
5
- class AttributeSet # :nodoc:
6
- delegate :each_value, :fetch, :except, to: :attributes
7
-
8
- def initialize(attributes)
9
- @attributes = attributes
10
- end
11
-
12
- def [](name)
13
- attributes[name] || Attribute.null(name)
14
- end
15
-
16
- def []=(name, value)
17
- attributes[name] = value
18
- end
19
-
20
- def values_before_type_cast
21
- attributes.transform_values(&:value_before_type_cast)
22
- end
23
-
24
- def to_hash
25
- initialized_attributes.transform_values(&:value)
26
- end
27
- alias_method :to_h, :to_hash
28
-
29
- def key?(name)
30
- attributes.key?(name) && self[name].initialized?
31
- end
32
-
33
- def keys
34
- attributes.each_key.select { |name| self[name].initialized? }
35
- end
36
-
37
- if defined?(JRUBY_VERSION)
38
- # This form is significantly faster on JRuby, and this is one of our biggest hotspots.
39
- # https://github.com/jruby/jruby/pull/2562
40
- def fetch_value(name, &block)
41
- self[name].value(&block)
42
- end
43
- else
44
- def fetch_value(name)
45
- self[name].value { |n| yield n if block_given? }
46
- end
47
- end
48
-
49
- def write_from_database(name, value)
50
- attributes[name] = self[name].with_value_from_database(value)
51
- end
52
-
53
- def write_from_user(name, value)
54
- attributes[name] = self[name].with_value_from_user(value)
55
- end
56
-
57
- def write_cast_value(name, value)
58
- attributes[name] = self[name].with_cast_value(value)
59
- end
60
-
61
- def freeze
62
- @attributes.freeze
63
- super
64
- end
65
-
66
- def deep_dup
67
- dup.tap do |copy|
68
- copy.instance_variable_set(:@attributes, attributes.deep_dup)
69
- end
70
- end
71
-
72
- def initialize_dup(_)
73
- @attributes = attributes.dup
74
- super
75
- end
76
-
77
- def initialize_clone(_)
78
- @attributes = attributes.clone
79
- super
80
- end
81
-
82
- def reset(key)
83
- if key?(key)
84
- write_from_database(key, nil)
85
- end
86
- end
87
-
88
- def accessed
89
- attributes.select { |_, attr| attr.has_been_read? }.keys
90
- end
91
-
92
- def map(&block)
93
- new_attributes = attributes.transform_values(&block)
94
- AttributeSet.new(new_attributes)
95
- end
96
-
97
- def ==(other)
98
- attributes == other.attributes
99
- end
100
-
101
- # TODO Change this to private once we've dropped Ruby 2.2 support.
102
- # Workaround for Ruby 2.2 "private attribute?" warning.
103
- protected
104
-
105
- attr_reader :attributes
106
-
107
- private
108
-
109
- def initialized_attributes
110
- attributes.select { |_, attr| attr.initialized? }
111
- end
112
- end
113
- end
@@ -1,126 +0,0 @@
1
- require "active_record/attribute"
2
-
3
- module ActiveRecord
4
- class AttributeSet # :nodoc:
5
- class Builder # :nodoc:
6
- attr_reader :types, :default_attributes
7
-
8
- def initialize(types, default_attributes = {})
9
- @types = types
10
- @default_attributes = default_attributes
11
- end
12
-
13
- def build_from_database(values = {}, additional_types = {})
14
- attributes = LazyAttributeHash.new(types, values, additional_types, default_attributes)
15
- AttributeSet.new(attributes)
16
- end
17
- end
18
- end
19
-
20
- class LazyAttributeHash # :nodoc:
21
- delegate :transform_values, :each_key, :each_value, :fetch, :except, to: :materialize
22
-
23
- def initialize(types, values, additional_types, default_attributes, delegate_hash = {})
24
- @types = types
25
- @values = values
26
- @additional_types = additional_types
27
- @materialized = false
28
- @delegate_hash = delegate_hash
29
- @default_attributes = default_attributes
30
- end
31
-
32
- def key?(key)
33
- delegate_hash.key?(key) || values.key?(key) || types.key?(key)
34
- end
35
-
36
- def [](key)
37
- delegate_hash[key] || assign_default_value(key)
38
- end
39
-
40
- def []=(key, value)
41
- if frozen?
42
- raise RuntimeError, "Can't modify frozen hash"
43
- end
44
- delegate_hash[key] = value
45
- end
46
-
47
- def deep_dup
48
- dup.tap do |copy|
49
- copy.instance_variable_set(:@delegate_hash, delegate_hash.transform_values(&:dup))
50
- end
51
- end
52
-
53
- def initialize_dup(_)
54
- @delegate_hash = Hash[delegate_hash]
55
- super
56
- end
57
-
58
- def select
59
- keys = types.keys | values.keys | delegate_hash.keys
60
- keys.each_with_object({}) do |key, hash|
61
- attribute = self[key]
62
- if yield(key, attribute)
63
- hash[key] = attribute
64
- end
65
- end
66
- end
67
-
68
- def ==(other)
69
- if other.is_a?(LazyAttributeHash)
70
- materialize == other.materialize
71
- else
72
- materialize == other
73
- end
74
- end
75
-
76
- def marshal_dump
77
- [@types, @values, @additional_types, @default_attributes, @delegate_hash]
78
- end
79
-
80
- def marshal_load(values)
81
- if values.is_a?(Hash)
82
- empty_hash = {}.freeze
83
- initialize(empty_hash, empty_hash, empty_hash, empty_hash, values)
84
- @materialized = true
85
- else
86
- initialize(*values)
87
- end
88
- end
89
-
90
- # TODO Change this to private once we've dropped Ruby 2.2 support.
91
- # Workaround for Ruby 2.2 "private attribute?" warning.
92
- protected
93
-
94
- attr_reader :types, :values, :additional_types, :delegate_hash, :default_attributes
95
-
96
- def materialize
97
- unless @materialized
98
- values.each_key { |key| self[key] }
99
- types.each_key { |key| self[key] }
100
- unless frozen?
101
- @materialized = true
102
- end
103
- end
104
- delegate_hash
105
- end
106
-
107
- private
108
-
109
- def assign_default_value(name)
110
- type = additional_types.fetch(name, types[name])
111
- value_present = true
112
- value = values.fetch(name) { value_present = false }
113
-
114
- if value_present
115
- delegate_hash[name] = Attribute.from_database(name, value, type)
116
- elsif types.key?(name)
117
- attr = default_attributes[name]
118
- if attr
119
- delegate_hash[name] = attr.dup
120
- else
121
- delegate_hash[name] = Attribute.uninitialized(name, type)
122
- end
123
- end
124
- end
125
- end
126
- end
@@ -1,41 +0,0 @@
1
- module ActiveRecord
2
- class AttributeSet
3
- # Attempts to do more intelligent YAML dumping of an
4
- # ActiveRecord::AttributeSet to reduce the size of the resulting string
5
- class YAMLEncoder # :nodoc:
6
- def initialize(default_types)
7
- @default_types = default_types
8
- end
9
-
10
- def encode(attribute_set, coder)
11
- coder["concise_attributes"] = attribute_set.each_value.map do |attr|
12
- if attr.type.equal?(default_types[attr.name])
13
- attr.with_type(nil)
14
- else
15
- attr
16
- end
17
- end
18
- end
19
-
20
- def decode(coder)
21
- if coder["attributes"]
22
- coder["attributes"]
23
- else
24
- attributes_hash = Hash[coder["concise_attributes"].map do |attr|
25
- if attr.type.nil?
26
- attr = attr.with_type(default_types[attr.name])
27
- end
28
- [attr.name, attr]
29
- end]
30
- AttributeSet.new(attributes_hash)
31
- end
32
- end
33
-
34
- # TODO Change this to private once we've dropped Ruby 2.2 support.
35
- # Workaround for Ruby 2.2 "private attribute?" warning.
36
- protected
37
-
38
- attr_reader :default_types
39
- end
40
- end
41
- end
@@ -1,10 +0,0 @@
1
- module ActiveRecord
2
- module ConnectionAdapters
3
- module PostgreSQL
4
- module OID # :nodoc:
5
- class Json < Type::Internal::AbstractJson
6
- end
7
- end
8
- end
9
- end
10
- end
@@ -1,16 +0,0 @@
1
- #FIXME Remove if ArJdbcMysql will give.
2
- module ArJdbcMySQL #:nodoc:
3
- class Error < StandardError #:nodoc:
4
- attr_accessor :error_number, :sql_state
5
-
6
- def initialize(msg)
7
- super
8
- @error_number = nil
9
- @sql_state = nil
10
- end
11
-
12
- # Mysql gem compatibility
13
- alias_method :errno, :error_number
14
- alias_method :error, :message
15
- end
16
- end
@@ -1,88 +0,0 @@
1
- module ActiveRecord
2
- class PredicateBuilder
3
- class AssociationQueryHandler # :nodoc:
4
- def self.value_for(table, column, value)
5
- associated_table = table.associated_table(column)
6
- klass = if associated_table.polymorphic_association? && ::Array === value && value.first.is_a?(Base)
7
- PolymorphicArrayValue
8
- else
9
- AssociationQueryValue
10
- end
11
-
12
- klass.new(associated_table, value)
13
- end
14
-
15
- def initialize(predicate_builder)
16
- @predicate_builder = predicate_builder
17
- end
18
-
19
- def call(attribute, value)
20
- queries = {}
21
-
22
- table = value.associated_table
23
- if value.base_class
24
- queries[table.association_foreign_type.to_s] = value.base_class.name
25
- end
26
-
27
- queries[table.association_foreign_key.to_s] = value.ids
28
- predicate_builder.build_from_hash(queries)
29
- end
30
-
31
- # TODO Change this to private once we've dropped Ruby 2.2 support.
32
- # Workaround for Ruby 2.2 "private attribute?" warning.
33
- protected
34
-
35
- attr_reader :predicate_builder
36
- end
37
-
38
- class AssociationQueryValue # :nodoc:
39
- attr_reader :associated_table, :value
40
-
41
- def initialize(associated_table, value)
42
- @associated_table = associated_table
43
- @value = value
44
- end
45
-
46
- def ids
47
- case value
48
- when Relation
49
- value.select(primary_key)
50
- when Array
51
- value.map { |v| convert_to_id(v) }
52
- else
53
- convert_to_id(value)
54
- end
55
- end
56
-
57
- def base_class
58
- if associated_table.polymorphic_association?
59
- @base_class ||= polymorphic_base_class_from_value
60
- end
61
- end
62
-
63
- private
64
-
65
- def primary_key
66
- associated_table.association_primary_key(base_class)
67
- end
68
-
69
- def polymorphic_base_class_from_value
70
- case value
71
- when Relation
72
- value.klass.base_class
73
- when Base
74
- value.class.base_class
75
- end
76
- end
77
-
78
- def convert_to_id(value)
79
- case value
80
- when Base
81
- value._read_attribute(primary_key)
82
- else
83
- value
84
- end
85
- end
86
- end
87
- end
88
- end
@@ -1,59 +0,0 @@
1
- module ActiveRecord
2
- class PredicateBuilder
3
- class PolymorphicArrayHandler # :nodoc:
4
- def initialize(predicate_builder)
5
- @predicate_builder = predicate_builder
6
- end
7
-
8
- def call(attribute, value)
9
- table = value.associated_table
10
- queries = value.type_to_ids_mapping.map do |type, ids|
11
- { table.association_foreign_type.to_s => type, table.association_foreign_key.to_s => ids }
12
- end
13
-
14
- predicates = queries.map { |query| predicate_builder.build_from_hash(query) }
15
-
16
- if predicates.size > 1
17
- type_and_ids_predicates = predicates.map { |type_predicate, id_predicate| Arel::Nodes::Grouping.new(type_predicate.and(id_predicate)) }
18
- type_and_ids_predicates.inject(&:or)
19
- else
20
- predicates.first
21
- end
22
- end
23
-
24
- # TODO Change this to private once we've dropped Ruby 2.2 support.
25
- # Workaround for Ruby 2.2 "private attribute?" warning.
26
- protected
27
-
28
- attr_reader :predicate_builder
29
- end
30
-
31
- class PolymorphicArrayValue # :nodoc:
32
- attr_reader :associated_table, :values
33
-
34
- def initialize(associated_table, values)
35
- @associated_table = associated_table
36
- @values = values
37
- end
38
-
39
- def type_to_ids_mapping
40
- default_hash = Hash.new { |hsh, key| hsh[key] = [] }
41
- values.each_with_object(default_hash) { |value, hash| hash[base_class(value).name] << convert_to_id(value) }
42
- end
43
-
44
- private
45
-
46
- def primary_key(value)
47
- associated_table.association_primary_key(base_class(value))
48
- end
49
-
50
- def base_class(value)
51
- value.class.base_class
52
- end
53
-
54
- def convert_to_id(value)
55
- value._read_attribute(primary_key(value))
56
- end
57
- end
58
- end
59
- end