activerecord 4.2.0 → 5.2.8.1

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 (274) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +640 -928
  3. data/MIT-LICENSE +2 -2
  4. data/README.rdoc +10 -11
  5. data/examples/performance.rb +32 -31
  6. data/examples/simple.rb +5 -4
  7. data/lib/active_record/aggregations.rb +264 -247
  8. data/lib/active_record/association_relation.rb +24 -6
  9. data/lib/active_record/associations/alias_tracker.rb +29 -35
  10. data/lib/active_record/associations/association.rb +87 -41
  11. data/lib/active_record/associations/association_scope.rb +106 -132
  12. data/lib/active_record/associations/belongs_to_association.rb +55 -36
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -8
  14. data/lib/active_record/associations/builder/association.rb +29 -38
  15. data/lib/active_record/associations/builder/belongs_to.rb +77 -30
  16. data/lib/active_record/associations/builder/collection_association.rb +14 -23
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +50 -39
  18. data/lib/active_record/associations/builder/has_many.rb +6 -4
  19. data/lib/active_record/associations/builder/has_one.rb +13 -6
  20. data/lib/active_record/associations/builder/singular_association.rb +15 -11
  21. data/lib/active_record/associations/collection_association.rb +145 -266
  22. data/lib/active_record/associations/collection_proxy.rb +242 -138
  23. data/lib/active_record/associations/foreign_association.rb +13 -0
  24. data/lib/active_record/associations/has_many_association.rb +35 -75
  25. data/lib/active_record/associations/has_many_through_association.rb +51 -69
  26. data/lib/active_record/associations/has_one_association.rb +39 -24
  27. data/lib/active_record/associations/has_one_through_association.rb +18 -9
  28. data/lib/active_record/associations/join_dependency/join_association.rb +40 -81
  29. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  30. data/lib/active_record/associations/join_dependency/join_part.rb +12 -12
  31. data/lib/active_record/associations/join_dependency.rb +134 -154
  32. data/lib/active_record/associations/preloader/association.rb +85 -116
  33. data/lib/active_record/associations/preloader/through_association.rb +85 -74
  34. data/lib/active_record/associations/preloader.rb +83 -93
  35. data/lib/active_record/associations/singular_association.rb +27 -40
  36. data/lib/active_record/associations/through_association.rb +48 -23
  37. data/lib/active_record/associations.rb +1732 -1596
  38. data/lib/active_record/attribute_assignment.rb +58 -182
  39. data/lib/active_record/attribute_decorators.rb +39 -15
  40. data/lib/active_record/attribute_methods/before_type_cast.rb +12 -5
  41. data/lib/active_record/attribute_methods/dirty.rb +94 -125
  42. data/lib/active_record/attribute_methods/primary_key.rb +86 -71
  43. data/lib/active_record/attribute_methods/query.rb +4 -2
  44. data/lib/active_record/attribute_methods/read.rb +45 -63
  45. data/lib/active_record/attribute_methods/serialization.rb +40 -20
  46. data/lib/active_record/attribute_methods/time_zone_conversion.rb +62 -36
  47. data/lib/active_record/attribute_methods/write.rb +31 -46
  48. data/lib/active_record/attribute_methods.rb +170 -117
  49. data/lib/active_record/attributes.rb +201 -74
  50. data/lib/active_record/autosave_association.rb +118 -45
  51. data/lib/active_record/base.rb +60 -48
  52. data/lib/active_record/callbacks.rb +97 -57
  53. data/lib/active_record/coders/json.rb +3 -1
  54. data/lib/active_record/coders/yaml_column.rb +37 -13
  55. data/lib/active_record/collection_cache_key.rb +53 -0
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +712 -284
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +10 -5
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +254 -87
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +72 -22
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +119 -52
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +6 -4
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +67 -46
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +328 -217
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +81 -36
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +617 -212
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +139 -75
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +332 -191
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +567 -563
  69. data/lib/active_record/connection_adapters/column.rb +50 -41
  70. data/lib/active_record/connection_adapters/connection_specification.rb +147 -135
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +33 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +140 -0
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +72 -0
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +44 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +73 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +87 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +80 -0
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +148 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +35 -0
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +42 -195
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +35 -11
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +46 -115
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +50 -57
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +10 -6
  87. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +5 -2
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +5 -1
  90. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
  91. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +9 -13
  92. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  93. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +7 -3
  94. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +31 -19
  95. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  97. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -9
  99. data/lib/active_record/connection_adapters/postgresql/oid/{integer.rb → oid.rb} +6 -2
  100. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +33 -11
  101. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -34
  102. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  103. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +65 -51
  104. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +5 -3
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +23 -25
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +107 -47
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +65 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +144 -90
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +50 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +466 -280
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +39 -0
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +12 -8
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +439 -330
  117. data/lib/active_record/connection_adapters/schema_cache.rb +48 -24
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +34 -0
  119. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  120. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +67 -0
  121. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +106 -0
  125. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +269 -324
  126. data/lib/active_record/connection_adapters/statement_pool.rb +34 -13
  127. data/lib/active_record/connection_handling.rb +40 -27
  128. data/lib/active_record/core.rb +205 -202
  129. data/lib/active_record/counter_cache.rb +80 -37
  130. data/lib/active_record/define_callbacks.rb +22 -0
  131. data/lib/active_record/dynamic_matchers.rb +87 -105
  132. data/lib/active_record/enum.rb +136 -90
  133. data/lib/active_record/errors.rb +180 -52
  134. data/lib/active_record/explain.rb +23 -11
  135. data/lib/active_record/explain_registry.rb +4 -2
  136. data/lib/active_record/explain_subscriber.rb +11 -6
  137. data/lib/active_record/fixture_set/file.rb +35 -9
  138. data/lib/active_record/fixtures.rb +193 -135
  139. data/lib/active_record/gem_version.rb +5 -3
  140. data/lib/active_record/inheritance.rb +148 -112
  141. data/lib/active_record/integration.rb +70 -28
  142. data/lib/active_record/internal_metadata.rb +45 -0
  143. data/lib/active_record/legacy_yaml_adapter.rb +48 -0
  144. data/lib/active_record/locale/en.yml +3 -2
  145. data/lib/active_record/locking/optimistic.rb +92 -98
  146. data/lib/active_record/locking/pessimistic.rb +15 -3
  147. data/lib/active_record/log_subscriber.rb +95 -33
  148. data/lib/active_record/migration/command_recorder.rb +133 -90
  149. data/lib/active_record/migration/compatibility.rb +217 -0
  150. data/lib/active_record/migration/join_table.rb +8 -6
  151. data/lib/active_record/migration.rb +594 -267
  152. data/lib/active_record/model_schema.rb +292 -111
  153. data/lib/active_record/nested_attributes.rb +266 -214
  154. data/lib/active_record/no_touching.rb +8 -2
  155. data/lib/active_record/null_relation.rb +24 -37
  156. data/lib/active_record/persistence.rb +350 -119
  157. data/lib/active_record/query_cache.rb +13 -24
  158. data/lib/active_record/querying.rb +19 -17
  159. data/lib/active_record/railtie.rb +117 -35
  160. data/lib/active_record/railties/console_sandbox.rb +2 -0
  161. data/lib/active_record/railties/controller_runtime.rb +9 -3
  162. data/lib/active_record/railties/databases.rake +160 -174
  163. data/lib/active_record/readonly_attributes.rb +5 -4
  164. data/lib/active_record/reflection.rb +447 -288
  165. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  166. data/lib/active_record/relation/batches.rb +204 -55
  167. data/lib/active_record/relation/calculations.rb +259 -244
  168. data/lib/active_record/relation/delegation.rb +67 -60
  169. data/lib/active_record/relation/finder_methods.rb +290 -253
  170. data/lib/active_record/relation/from_clause.rb +26 -0
  171. data/lib/active_record/relation/merger.rb +91 -68
  172. data/lib/active_record/relation/predicate_builder/array_handler.rb +24 -23
  173. data/lib/active_record/relation/predicate_builder/association_query_value.rb +46 -0
  174. data/lib/active_record/relation/predicate_builder/base_handler.rb +19 -0
  175. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +20 -0
  176. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +56 -0
  177. data/lib/active_record/relation/predicate_builder/range_handler.rb +42 -0
  178. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  179. data/lib/active_record/relation/predicate_builder.rb +118 -92
  180. data/lib/active_record/relation/query_attribute.rb +45 -0
  181. data/lib/active_record/relation/query_methods.rb +446 -389
  182. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  183. data/lib/active_record/relation/spawn_methods.rb +18 -16
  184. data/lib/active_record/relation/where_clause.rb +186 -0
  185. data/lib/active_record/relation/where_clause_factory.rb +34 -0
  186. data/lib/active_record/relation.rb +287 -339
  187. data/lib/active_record/result.rb +54 -36
  188. data/lib/active_record/runtime_registry.rb +6 -4
  189. data/lib/active_record/sanitization.rb +155 -124
  190. data/lib/active_record/schema.rb +30 -24
  191. data/lib/active_record/schema_dumper.rb +91 -87
  192. data/lib/active_record/schema_migration.rb +19 -19
  193. data/lib/active_record/scoping/default.rb +102 -84
  194. data/lib/active_record/scoping/named.rb +81 -32
  195. data/lib/active_record/scoping.rb +45 -26
  196. data/lib/active_record/secure_token.rb +40 -0
  197. data/lib/active_record/serialization.rb +5 -5
  198. data/lib/active_record/statement_cache.rb +45 -35
  199. data/lib/active_record/store.rb +42 -36
  200. data/lib/active_record/suppressor.rb +61 -0
  201. data/lib/active_record/table_metadata.rb +82 -0
  202. data/lib/active_record/tasks/database_tasks.rb +136 -95
  203. data/lib/active_record/tasks/mysql_database_tasks.rb +59 -89
  204. data/lib/active_record/tasks/postgresql_database_tasks.rb +84 -31
  205. data/lib/active_record/tasks/sqlite_database_tasks.rb +44 -16
  206. data/lib/active_record/timestamp.rb +70 -38
  207. data/lib/active_record/touch_later.rb +64 -0
  208. data/lib/active_record/transactions.rb +208 -123
  209. data/lib/active_record/translation.rb +2 -0
  210. data/lib/active_record/type/adapter_specific_registry.rb +136 -0
  211. data/lib/active_record/type/date.rb +4 -41
  212. data/lib/active_record/type/date_time.rb +4 -38
  213. data/lib/active_record/type/decimal_without_scale.rb +6 -2
  214. data/lib/active_record/type/hash_lookup_type_map.rb +13 -5
  215. data/lib/active_record/type/internal/timezone.rb +17 -0
  216. data/lib/active_record/type/json.rb +30 -0
  217. data/lib/active_record/type/serialized.rb +30 -15
  218. data/lib/active_record/type/text.rb +2 -2
  219. data/lib/active_record/type/time.rb +11 -16
  220. data/lib/active_record/type/type_map.rb +15 -17
  221. data/lib/active_record/type/unsigned_integer.rb +9 -7
  222. data/lib/active_record/type.rb +79 -23
  223. data/lib/active_record/type_caster/connection.rb +33 -0
  224. data/lib/active_record/type_caster/map.rb +23 -0
  225. data/lib/active_record/type_caster.rb +9 -0
  226. data/lib/active_record/validations/absence.rb +25 -0
  227. data/lib/active_record/validations/associated.rb +13 -4
  228. data/lib/active_record/validations/length.rb +26 -0
  229. data/lib/active_record/validations/presence.rb +14 -13
  230. data/lib/active_record/validations/uniqueness.rb +41 -32
  231. data/lib/active_record/validations.rb +38 -35
  232. data/lib/active_record/version.rb +3 -1
  233. data/lib/active_record.rb +36 -21
  234. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  235. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  236. data/lib/rails/generators/active_record/migration/migration_generator.rb +43 -35
  237. data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +8 -6
  238. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +8 -7
  239. data/lib/rails/generators/active_record/migration.rb +18 -1
  240. data/lib/rails/generators/active_record/model/model_generator.rb +18 -22
  241. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +3 -0
  242. data/lib/rails/generators/active_record.rb +7 -5
  243. metadata +77 -53
  244. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  245. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  246. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  247. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  248. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  249. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  250. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  251. data/lib/active_record/attribute.rb +0 -149
  252. data/lib/active_record/attribute_set/builder.rb +0 -86
  253. data/lib/active_record/attribute_set.rb +0 -77
  254. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -491
  255. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  256. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  257. data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +0 -13
  258. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
  259. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  260. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  261. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  262. data/lib/active_record/type/big_integer.rb +0 -13
  263. data/lib/active_record/type/binary.rb +0 -50
  264. data/lib/active_record/type/boolean.rb +0 -30
  265. data/lib/active_record/type/decimal.rb +0 -40
  266. data/lib/active_record/type/decorator.rb +0 -14
  267. data/lib/active_record/type/float.rb +0 -19
  268. data/lib/active_record/type/integer.rb +0 -55
  269. data/lib/active_record/type/mutable.rb +0 -16
  270. data/lib/active_record/type/numeric.rb +0 -36
  271. data/lib/active_record/type/string.rb +0 -36
  272. data/lib/active_record/type/time_value.rb +0 -38
  273. data/lib/active_record/type/value.rb +0 -101
  274. /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,193 +0,0 @@
1
- require 'active_support/core_ext/hash/conversions'
2
-
3
- module ActiveRecord #:nodoc:
4
- module Serialization
5
- include ActiveModel::Serializers::Xml
6
-
7
- # Builds an XML document to represent the model. Some configuration is
8
- # available through +options+. However more complicated cases should
9
- # override ActiveRecord::Base#to_xml.
10
- #
11
- # By default the generated XML document will include the processing
12
- # instruction and all the object's attributes. For example:
13
- #
14
- # <?xml version="1.0" encoding="UTF-8"?>
15
- # <topic>
16
- # <title>The First Topic</title>
17
- # <author-name>David</author-name>
18
- # <id type="integer">1</id>
19
- # <approved type="boolean">false</approved>
20
- # <replies-count type="integer">0</replies-count>
21
- # <bonus-time type="dateTime">2000-01-01T08:28:00+12:00</bonus-time>
22
- # <written-on type="dateTime">2003-07-16T09:28:00+1200</written-on>
23
- # <content>Have a nice day</content>
24
- # <author-email-address>david@loudthinking.com</author-email-address>
25
- # <parent-id></parent-id>
26
- # <last-read type="date">2004-04-15</last-read>
27
- # </topic>
28
- #
29
- # This behavior can be controlled with <tt>:only</tt>, <tt>:except</tt>,
30
- # <tt>:skip_instruct</tt>, <tt>:skip_types</tt>, <tt>:dasherize</tt> and <tt>:camelize</tt> .
31
- # The <tt>:only</tt> and <tt>:except</tt> options are the same as for the
32
- # +attributes+ method. The default is to dasherize all column names, but you
33
- # can disable this setting <tt>:dasherize</tt> to +false+. Setting <tt>:camelize</tt>
34
- # to +true+ will camelize all column names - this also overrides <tt>:dasherize</tt>.
35
- # To not have the column type included in the XML output set <tt>:skip_types</tt> to +true+.
36
- #
37
- # For instance:
38
- #
39
- # topic.to_xml(skip_instruct: true, except: [ :id, :bonus_time, :written_on, :replies_count ])
40
- #
41
- # <topic>
42
- # <title>The First Topic</title>
43
- # <author-name>David</author-name>
44
- # <approved type="boolean">false</approved>
45
- # <content>Have a nice day</content>
46
- # <author-email-address>david@loudthinking.com</author-email-address>
47
- # <parent-id></parent-id>
48
- # <last-read type="date">2004-04-15</last-read>
49
- # </topic>
50
- #
51
- # To include first level associations use <tt>:include</tt>:
52
- #
53
- # firm.to_xml include: [ :account, :clients ]
54
- #
55
- # <?xml version="1.0" encoding="UTF-8"?>
56
- # <firm>
57
- # <id type="integer">1</id>
58
- # <rating type="integer">1</rating>
59
- # <name>37signals</name>
60
- # <clients type="array">
61
- # <client>
62
- # <rating type="integer">1</rating>
63
- # <name>Summit</name>
64
- # </client>
65
- # <client>
66
- # <rating type="integer">1</rating>
67
- # <name>Microsoft</name>
68
- # </client>
69
- # </clients>
70
- # <account>
71
- # <id type="integer">1</id>
72
- # <credit-limit type="integer">50</credit-limit>
73
- # </account>
74
- # </firm>
75
- #
76
- # Additionally, the record being serialized will be passed to a Proc's second
77
- # parameter. This allows for ad hoc additions to the resultant document that
78
- # incorporate the context of the record being serialized. And by leveraging the
79
- # closure created by a Proc, to_xml can be used to add elements that normally fall
80
- # outside of the scope of the model -- for example, generating and appending URLs
81
- # associated with models.
82
- #
83
- # proc = Proc.new { |options, record| options[:builder].tag!('name-reverse', record.name.reverse) }
84
- # firm.to_xml procs: [ proc ]
85
- #
86
- # <firm>
87
- # # ... normal attributes as shown above ...
88
- # <name-reverse>slangis73</name-reverse>
89
- # </firm>
90
- #
91
- # To include deeper levels of associations pass a hash like this:
92
- #
93
- # firm.to_xml include: {account: {}, clients: {include: :address}}
94
- # <?xml version="1.0" encoding="UTF-8"?>
95
- # <firm>
96
- # <id type="integer">1</id>
97
- # <rating type="integer">1</rating>
98
- # <name>37signals</name>
99
- # <clients type="array">
100
- # <client>
101
- # <rating type="integer">1</rating>
102
- # <name>Summit</name>
103
- # <address>
104
- # ...
105
- # </address>
106
- # </client>
107
- # <client>
108
- # <rating type="integer">1</rating>
109
- # <name>Microsoft</name>
110
- # <address>
111
- # ...
112
- # </address>
113
- # </client>
114
- # </clients>
115
- # <account>
116
- # <id type="integer">1</id>
117
- # <credit-limit type="integer">50</credit-limit>
118
- # </account>
119
- # </firm>
120
- #
121
- # To include any methods on the model being called use <tt>:methods</tt>:
122
- #
123
- # firm.to_xml methods: [ :calculated_earnings, :real_earnings ]
124
- #
125
- # <firm>
126
- # # ... normal attributes as shown above ...
127
- # <calculated-earnings>100000000000000000</calculated-earnings>
128
- # <real-earnings>5</real-earnings>
129
- # </firm>
130
- #
131
- # To call any additional Procs use <tt>:procs</tt>. The Procs are passed a
132
- # modified version of the options hash that was given to +to_xml+:
133
- #
134
- # proc = Proc.new { |options| options[:builder].tag!('abc', 'def') }
135
- # firm.to_xml procs: [ proc ]
136
- #
137
- # <firm>
138
- # # ... normal attributes as shown above ...
139
- # <abc>def</abc>
140
- # </firm>
141
- #
142
- # Alternatively, you can yield the builder object as part of the +to_xml+ call:
143
- #
144
- # firm.to_xml do |xml|
145
- # xml.creator do
146
- # xml.first_name "David"
147
- # xml.last_name "Heinemeier Hansson"
148
- # end
149
- # end
150
- #
151
- # <firm>
152
- # # ... normal attributes as shown above ...
153
- # <creator>
154
- # <first_name>David</first_name>
155
- # <last_name>Heinemeier Hansson</last_name>
156
- # </creator>
157
- # </firm>
158
- #
159
- # As noted above, you may override +to_xml+ in your ActiveRecord::Base
160
- # subclasses to have complete control about what's generated. The general
161
- # form of doing this is:
162
- #
163
- # class IHaveMyOwnXML < ActiveRecord::Base
164
- # def to_xml(options = {})
165
- # require 'builder'
166
- # options[:indent] ||= 2
167
- # xml = options[:builder] ||= ::Builder::XmlMarkup.new(indent: options[:indent])
168
- # xml.instruct! unless options[:skip_instruct]
169
- # xml.level_one do
170
- # xml.tag!(:second_level, 'content')
171
- # end
172
- # end
173
- # end
174
- def to_xml(options = {}, &block)
175
- XmlSerializer.new(self, options).serialize(&block)
176
- end
177
- end
178
-
179
- class XmlSerializer < ActiveModel::Serializers::Xml::Serializer #:nodoc:
180
- class Attribute < ActiveModel::Serializers::Xml::Serializer::Attribute #:nodoc:
181
- def compute_type
182
- klass = @serializable.class
183
- column = klass.columns_hash[name] || Type::Value.new
184
-
185
- type = ActiveSupport::XmlMini::TYPE_NAMES[value.class.name] || column.type
186
-
187
- { :text => :string,
188
- :time => :datetime }[type] || type
189
- end
190
- protected :compute_type
191
- end
192
- end
193
- end
@@ -1,13 +0,0 @@
1
- require 'active_record/type/integer'
2
-
3
- module ActiveRecord
4
- module Type
5
- class BigInteger < Integer # :nodoc:
6
- private
7
-
8
- def max_value
9
- ::Float::INFINITY
10
- end
11
- end
12
- end
13
- end
@@ -1,50 +0,0 @@
1
- module ActiveRecord
2
- module Type
3
- class Binary < Value # :nodoc:
4
- def type
5
- :binary
6
- end
7
-
8
- def binary?
9
- true
10
- end
11
-
12
- def type_cast(value)
13
- if value.is_a?(Data)
14
- value.to_s
15
- else
16
- super
17
- end
18
- end
19
-
20
- def type_cast_for_database(value)
21
- return if value.nil?
22
- Data.new(super)
23
- end
24
-
25
- def changed_in_place?(raw_old_value, value)
26
- old_value = type_cast_from_database(raw_old_value)
27
- old_value != value
28
- end
29
-
30
- class Data # :nodoc:
31
- def initialize(value)
32
- @value = value.to_s
33
- end
34
-
35
- def to_s
36
- @value
37
- end
38
- alias_method :to_str, :to_s
39
-
40
- def hex
41
- @value.unpack('H*')[0]
42
- end
43
-
44
- def ==(other)
45
- other == to_s || super
46
- end
47
- end
48
- end
49
- end
50
- end
@@ -1,30 +0,0 @@
1
- module ActiveRecord
2
- module Type
3
- class Boolean < Value # :nodoc:
4
- def type
5
- :boolean
6
- end
7
-
8
- private
9
-
10
- def cast_value(value)
11
- if value == ''
12
- nil
13
- elsif ConnectionAdapters::Column::TRUE_VALUES.include?(value)
14
- true
15
- else
16
- if !ConnectionAdapters::Column::FALSE_VALUES.include?(value)
17
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
18
- You attempted to assign a value which is not explicitly `true` or `false`
19
- to a boolean column. Currently this value casts to `false`. This will
20
- change to match Ruby's semantics, and will cast to `true` in Rails 5.
21
- If you would like to maintain the current behavior, you should
22
- explicitly handle the values you would like cast to `false`.
23
- MSG
24
- end
25
- false
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,40 +0,0 @@
1
- module ActiveRecord
2
- module Type
3
- class Decimal < Value # :nodoc:
4
- include Numeric
5
-
6
- def type
7
- :decimal
8
- end
9
-
10
- def type_cast_for_schema(value)
11
- value.to_s
12
- end
13
-
14
- private
15
-
16
- def cast_value(value)
17
- case value
18
- when ::Float
19
- BigDecimal(value, float_precision)
20
- when ::Numeric, ::String
21
- BigDecimal(value, precision.to_i)
22
- else
23
- if value.respond_to?(:to_d)
24
- value.to_d
25
- else
26
- cast_value(value.to_s)
27
- end
28
- end
29
- end
30
-
31
- def float_precision
32
- if precision.to_i > ::Float::DIG + 1
33
- ::Float::DIG + 1
34
- else
35
- precision.to_i
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,14 +0,0 @@
1
- module ActiveRecord
2
- module Type
3
- module Decorator # :nodoc:
4
- def init_with(coder)
5
- @subtype = coder['subtype']
6
- __setobj__(@subtype)
7
- end
8
-
9
- def encode_with(coder)
10
- coder['subtype'] = __getobj__
11
- end
12
- end
13
- end
14
- end
@@ -1,19 +0,0 @@
1
- module ActiveRecord
2
- module Type
3
- class Float < Value # :nodoc:
4
- include Numeric
5
-
6
- def type
7
- :float
8
- end
9
-
10
- alias type_cast_for_database type_cast
11
-
12
- private
13
-
14
- def cast_value(value)
15
- value.to_f
16
- end
17
- end
18
- end
19
- end
@@ -1,55 +0,0 @@
1
- module ActiveRecord
2
- module Type
3
- class Integer < Value # :nodoc:
4
- include Numeric
5
-
6
- def initialize(*)
7
- super
8
- @range = min_value...max_value
9
- end
10
-
11
- def type
12
- :integer
13
- end
14
-
15
- alias type_cast_for_database type_cast
16
-
17
- def type_cast_from_database(value)
18
- return if value.nil?
19
- value.to_i
20
- end
21
-
22
- protected
23
-
24
- attr_reader :range
25
-
26
- private
27
-
28
- def cast_value(value)
29
- case value
30
- when true then 1
31
- when false then 0
32
- else
33
- result = value.to_i rescue nil
34
- ensure_in_range(result) if result
35
- result
36
- end
37
- end
38
-
39
- def ensure_in_range(value)
40
- unless range.cover?(value)
41
- raise RangeError, "#{value} is out of range for #{self.class} with limit #{limit || 4}"
42
- end
43
- end
44
-
45
- def max_value
46
- limit = self.limit || 4
47
- 1 << (limit * 8 - 1) # 8 bits per byte with one bit for sign
48
- end
49
-
50
- def min_value
51
- -max_value
52
- end
53
- end
54
- end
55
- end
@@ -1,16 +0,0 @@
1
- module ActiveRecord
2
- module Type
3
- module Mutable # :nodoc:
4
- def type_cast_from_user(value)
5
- type_cast_from_database(type_cast_for_database(value))
6
- end
7
-
8
- # +raw_old_value+ will be the `_before_type_cast` version of the
9
- # value (likely a string). +new_value+ will be the current, type
10
- # cast value.
11
- def changed_in_place?(raw_old_value, new_value)
12
- raw_old_value != type_cast_for_database(new_value)
13
- end
14
- end
15
- end
16
- end
@@ -1,36 +0,0 @@
1
- module ActiveRecord
2
- module Type
3
- module Numeric # :nodoc:
4
- def number?
5
- true
6
- end
7
-
8
- def type_cast(value)
9
- value = case value
10
- when true then 1
11
- when false then 0
12
- when ::String then value.presence
13
- else value
14
- end
15
- super(value)
16
- end
17
-
18
- def changed?(old_value, _new_value, new_value_before_type_cast) # :nodoc:
19
- super || number_to_non_number?(old_value, new_value_before_type_cast)
20
- end
21
-
22
- private
23
-
24
- def number_to_non_number?(old_value, new_value_before_type_cast)
25
- old_value != nil && non_numeric_string?(new_value_before_type_cast)
26
- end
27
-
28
- def non_numeric_string?(value)
29
- # 'wibble'.to_i will give zero, we want to make sure
30
- # that we aren't marking int zero to string zero as
31
- # changed.
32
- value.to_s !~ /\A\d+\.?\d*\z/
33
- end
34
- end
35
- end
36
- end
@@ -1,36 +0,0 @@
1
- module ActiveRecord
2
- module Type
3
- class String < Value # :nodoc:
4
- def type
5
- :string
6
- end
7
-
8
- def changed_in_place?(raw_old_value, new_value)
9
- if new_value.is_a?(::String)
10
- raw_old_value != new_value
11
- end
12
- end
13
-
14
- def type_cast_for_database(value)
15
- case value
16
- when ::Numeric, ActiveSupport::Duration then value.to_s
17
- when ::String then ::String.new(value)
18
- when true then "t"
19
- when false then "f"
20
- else super
21
- end
22
- end
23
-
24
- private
25
-
26
- def cast_value(value)
27
- case value
28
- when true then "t"
29
- when false then "f"
30
- # String.new is slightly faster than dup
31
- else ::String.new(value.to_s)
32
- end
33
- end
34
- end
35
- end
36
- end
@@ -1,38 +0,0 @@
1
- module ActiveRecord
2
- module Type
3
- module TimeValue # :nodoc:
4
- def klass
5
- ::Time
6
- end
7
-
8
- def type_cast_for_schema(value)
9
- "'#{value.to_s(:db)}'"
10
- end
11
-
12
- private
13
-
14
- def new_time(year, mon, mday, hour, min, sec, microsec, offset = nil)
15
- # Treat 0000-00-00 00:00:00 as nil.
16
- return if year.nil? || (year == 0 && mon == 0 && mday == 0)
17
-
18
- if offset
19
- time = ::Time.utc(year, mon, mday, hour, min, sec, microsec) rescue nil
20
- return unless time
21
-
22
- time -= offset
23
- Base.default_timezone == :utc ? time : time.getlocal
24
- else
25
- ::Time.public_send(Base.default_timezone, year, mon, mday, hour, min, sec, microsec) rescue nil
26
- end
27
- end
28
-
29
- # Doesn't handle time zones.
30
- def fast_string_to_time(string)
31
- if string =~ ConnectionAdapters::Column::Format::ISO_DATETIME
32
- microsec = ($7.to_r * 1_000_000).to_i
33
- new_time $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, microsec
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,101 +0,0 @@
1
- module ActiveRecord
2
- module Type
3
- class Value # :nodoc:
4
- attr_reader :precision, :scale, :limit
5
-
6
- # Valid options are +precision+, +scale+, and +limit+. They are only
7
- # used when dumping schema.
8
- def initialize(options = {})
9
- options.assert_valid_keys(:precision, :scale, :limit)
10
- @precision = options[:precision]
11
- @scale = options[:scale]
12
- @limit = options[:limit]
13
- end
14
-
15
- # The simplified type that this object represents. Returns a symbol such
16
- # as +:string+ or +:integer+
17
- def type; end
18
-
19
- # Type casts a string from the database into the appropriate ruby type.
20
- # Classes which do not need separate type casting behavior for database
21
- # and user provided values should override +cast_value+ instead.
22
- def type_cast_from_database(value)
23
- type_cast(value)
24
- end
25
-
26
- # Type casts a value from user input (e.g. from a setter). This value may
27
- # be a string from the form builder, or an already type cast value
28
- # provided manually to a setter.
29
- #
30
- # Classes which do not need separate type casting behavior for database
31
- # and user provided values should override +type_cast+ or +cast_value+
32
- # instead.
33
- def type_cast_from_user(value)
34
- type_cast(value)
35
- end
36
-
37
- # Cast a value from the ruby type to a type that the database knows how
38
- # to understand. The returned value from this method should be a
39
- # +String+, +Numeric+, +Date+, +Time+, +Symbol+, +true+, +false+, or
40
- # +nil+
41
- def type_cast_for_database(value)
42
- value
43
- end
44
-
45
- # Type cast a value for schema dumping. This method is private, as we are
46
- # hoping to remove it entirely.
47
- def type_cast_for_schema(value) # :nodoc:
48
- value.inspect
49
- end
50
-
51
- # These predicates are not documented, as I need to look further into
52
- # their use, and see if they can be removed entirely.
53
- def number? # :nodoc:
54
- false
55
- end
56
-
57
- def binary? # :nodoc:
58
- false
59
- end
60
-
61
- def klass # :nodoc:
62
- end
63
-
64
- # Determines whether a value has changed for dirty checking. +old_value+
65
- # and +new_value+ will always be type-cast. Types should not need to
66
- # override this method.
67
- def changed?(old_value, new_value, _new_value_before_type_cast)
68
- old_value != new_value
69
- end
70
-
71
- # Determines whether the mutable value has been modified since it was
72
- # read. Returns +false+ by default. This method should not be overridden
73
- # directly. Types which return a mutable value should include
74
- # +Type::Mutable+, which will define this method.
75
- def changed_in_place?(*)
76
- false
77
- end
78
-
79
- def ==(other)
80
- self.class == other.class &&
81
- precision == other.precision &&
82
- scale == other.scale &&
83
- limit == other.limit
84
- end
85
-
86
- private
87
-
88
- def type_cast(value)
89
- cast_value(value) unless value.nil?
90
- end
91
-
92
- # Convenience method for types which do not need separate type casting
93
- # behavior for user and database inputs. Called by
94
- # `type_cast_from_database` and `type_cast_from_user` for all values
95
- # except `nil`.
96
- def cast_value(value) # :doc:
97
- value
98
- end
99
- end
100
- end
101
- end