activerecord 4.2.11.1 → 5.0.0

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 (246) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1282 -1195
  3. data/MIT-LICENSE +2 -2
  4. data/README.rdoc +7 -8
  5. data/examples/performance.rb +2 -3
  6. data/examples/simple.rb +0 -1
  7. data/lib/active_record.rb +8 -4
  8. data/lib/active_record/aggregations.rb +35 -24
  9. data/lib/active_record/association_relation.rb +3 -3
  10. data/lib/active_record/associations.rb +317 -209
  11. data/lib/active_record/associations/alias_tracker.rb +19 -16
  12. data/lib/active_record/associations/association.rb +11 -9
  13. data/lib/active_record/associations/association_scope.rb +73 -102
  14. data/lib/active_record/associations/belongs_to_association.rb +21 -32
  15. data/lib/active_record/associations/builder/association.rb +28 -34
  16. data/lib/active_record/associations/builder/belongs_to.rb +43 -18
  17. data/lib/active_record/associations/builder/collection_association.rb +7 -19
  18. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +14 -11
  19. data/lib/active_record/associations/builder/has_many.rb +4 -4
  20. data/lib/active_record/associations/builder/has_one.rb +11 -6
  21. data/lib/active_record/associations/builder/singular_association.rb +3 -10
  22. data/lib/active_record/associations/collection_association.rb +49 -41
  23. data/lib/active_record/associations/collection_proxy.rb +67 -27
  24. data/lib/active_record/associations/foreign_association.rb +1 -1
  25. data/lib/active_record/associations/has_many_association.rb +20 -71
  26. data/lib/active_record/associations/has_many_through_association.rb +8 -47
  27. data/lib/active_record/associations/has_one_association.rb +12 -5
  28. data/lib/active_record/associations/join_dependency.rb +29 -19
  29. data/lib/active_record/associations/join_dependency/join_association.rb +16 -10
  30. data/lib/active_record/associations/preloader.rb +14 -4
  31. data/lib/active_record/associations/preloader/association.rb +46 -52
  32. data/lib/active_record/associations/preloader/collection_association.rb +0 -6
  33. data/lib/active_record/associations/preloader/has_many_through.rb +1 -1
  34. data/lib/active_record/associations/preloader/has_one.rb +0 -8
  35. data/lib/active_record/associations/preloader/through_association.rb +27 -14
  36. data/lib/active_record/associations/singular_association.rb +7 -1
  37. data/lib/active_record/associations/through_association.rb +11 -3
  38. data/lib/active_record/attribute.rb +68 -18
  39. data/lib/active_record/attribute/user_provided_default.rb +28 -0
  40. data/lib/active_record/attribute_assignment.rb +19 -140
  41. data/lib/active_record/attribute_decorators.rb +6 -5
  42. data/lib/active_record/attribute_methods.rb +76 -47
  43. data/lib/active_record/attribute_methods/before_type_cast.rb +1 -1
  44. data/lib/active_record/attribute_methods/dirty.rb +46 -86
  45. data/lib/active_record/attribute_methods/primary_key.rb +2 -2
  46. data/lib/active_record/attribute_methods/query.rb +2 -2
  47. data/lib/active_record/attribute_methods/read.rb +31 -59
  48. data/lib/active_record/attribute_methods/serialization.rb +13 -16
  49. data/lib/active_record/attribute_methods/time_zone_conversion.rb +61 -14
  50. data/lib/active_record/attribute_methods/write.rb +13 -37
  51. data/lib/active_record/attribute_mutation_tracker.rb +70 -0
  52. data/lib/active_record/attribute_set.rb +30 -3
  53. data/lib/active_record/attribute_set/builder.rb +6 -4
  54. data/lib/active_record/attributes.rb +199 -81
  55. data/lib/active_record/autosave_association.rb +49 -16
  56. data/lib/active_record/base.rb +32 -23
  57. data/lib/active_record/callbacks.rb +39 -43
  58. data/lib/active_record/coders/json.rb +1 -1
  59. data/lib/active_record/coders/yaml_column.rb +20 -8
  60. data/lib/active_record/collection_cache_key.rb +40 -0
  61. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +452 -182
  62. data/lib/active_record/connection_adapters/abstract/database_limits.rb +3 -3
  63. data/lib/active_record/connection_adapters/abstract/database_statements.rb +65 -61
  64. data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -2
  65. data/lib/active_record/connection_adapters/abstract/quoting.rb +74 -10
  66. data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
  67. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +61 -39
  68. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +236 -185
  69. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +72 -17
  70. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +380 -141
  71. data/lib/active_record/connection_adapters/abstract/transaction.rb +51 -34
  72. data/lib/active_record/connection_adapters/abstract_adapter.rb +141 -59
  73. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +401 -370
  74. data/lib/active_record/connection_adapters/column.rb +28 -43
  75. data/lib/active_record/connection_adapters/connection_specification.rb +15 -27
  76. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +22 -0
  77. data/lib/active_record/connection_adapters/mysql/column.rb +50 -0
  78. data/lib/active_record/connection_adapters/mysql/database_statements.rb +125 -0
  79. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +70 -0
  80. data/lib/active_record/connection_adapters/mysql/quoting.rb +51 -0
  81. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +67 -0
  82. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +93 -0
  83. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +54 -0
  84. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +32 -0
  85. data/lib/active_record/connection_adapters/mysql2_adapter.rb +29 -166
  86. data/lib/active_record/connection_adapters/postgresql/column.rb +5 -10
  87. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +10 -72
  88. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +42 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid.rb +1 -6
  90. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +27 -57
  91. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +2 -2
  92. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +1 -1
  93. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
  94. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +7 -22
  95. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +3 -3
  96. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +1 -26
  97. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +2 -2
  98. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +0 -4
  99. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +4 -4
  100. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +50 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +31 -17
  102. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +0 -4
  103. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +2 -2
  104. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +1 -1
  105. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +1 -1
  106. data/lib/active_record/connection_adapters/postgresql/quoting.rb +26 -18
  107. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +29 -10
  108. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -79
  109. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +47 -0
  110. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +234 -148
  111. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +35 -0
  112. data/lib/active_record/connection_adapters/postgresql_adapter.rb +248 -160
  113. data/lib/active_record/connection_adapters/schema_cache.rb +36 -23
  114. data/lib/active_record/connection_adapters/sql_type_metadata.rb +32 -0
  115. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +19 -0
  116. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +48 -0
  117. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +22 -0
  118. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +149 -192
  119. data/lib/active_record/connection_adapters/statement_pool.rb +31 -12
  120. data/lib/active_record/connection_handling.rb +37 -14
  121. data/lib/active_record/core.rb +89 -107
  122. data/lib/active_record/counter_cache.rb +13 -24
  123. data/lib/active_record/dynamic_matchers.rb +1 -20
  124. data/lib/active_record/enum.rb +113 -76
  125. data/lib/active_record/errors.rb +87 -48
  126. data/lib/active_record/explain_registry.rb +1 -1
  127. data/lib/active_record/explain_subscriber.rb +1 -1
  128. data/lib/active_record/fixture_set/file.rb +26 -5
  129. data/lib/active_record/fixtures.rb +76 -40
  130. data/lib/active_record/gem_version.rb +4 -4
  131. data/lib/active_record/inheritance.rb +32 -40
  132. data/lib/active_record/integration.rb +4 -4
  133. data/lib/active_record/internal_metadata.rb +56 -0
  134. data/lib/active_record/legacy_yaml_adapter.rb +18 -2
  135. data/lib/active_record/locale/en.yml +3 -2
  136. data/lib/active_record/locking/optimistic.rb +15 -15
  137. data/lib/active_record/locking/pessimistic.rb +1 -1
  138. data/lib/active_record/log_subscriber.rb +43 -21
  139. data/lib/active_record/migration.rb +363 -133
  140. data/lib/active_record/migration/command_recorder.rb +59 -18
  141. data/lib/active_record/migration/compatibility.rb +126 -0
  142. data/lib/active_record/model_schema.rb +129 -41
  143. data/lib/active_record/nested_attributes.rb +58 -29
  144. data/lib/active_record/null_relation.rb +16 -8
  145. data/lib/active_record/persistence.rb +121 -80
  146. data/lib/active_record/query_cache.rb +15 -18
  147. data/lib/active_record/querying.rb +10 -9
  148. data/lib/active_record/railtie.rb +23 -16
  149. data/lib/active_record/railties/controller_runtime.rb +1 -1
  150. data/lib/active_record/railties/databases.rake +69 -46
  151. data/lib/active_record/readonly_attributes.rb +1 -1
  152. data/lib/active_record/reflection.rb +282 -115
  153. data/lib/active_record/relation.rb +176 -116
  154. data/lib/active_record/relation/batches.rb +139 -34
  155. data/lib/active_record/relation/batches/batch_enumerator.rb +67 -0
  156. data/lib/active_record/relation/calculations.rb +79 -108
  157. data/lib/active_record/relation/delegation.rb +7 -20
  158. data/lib/active_record/relation/finder_methods.rb +163 -81
  159. data/lib/active_record/relation/from_clause.rb +32 -0
  160. data/lib/active_record/relation/merger.rb +16 -42
  161. data/lib/active_record/relation/predicate_builder.rb +120 -107
  162. data/lib/active_record/relation/predicate_builder/array_handler.rb +11 -16
  163. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +88 -0
  164. data/lib/active_record/relation/predicate_builder/base_handler.rb +17 -0
  165. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +17 -0
  166. data/lib/active_record/relation/predicate_builder/class_handler.rb +27 -0
  167. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +57 -0
  168. data/lib/active_record/relation/predicate_builder/range_handler.rb +33 -0
  169. data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
  170. data/lib/active_record/relation/query_attribute.rb +19 -0
  171. data/lib/active_record/relation/query_methods.rb +308 -244
  172. data/lib/active_record/relation/record_fetch_warning.rb +49 -0
  173. data/lib/active_record/relation/spawn_methods.rb +4 -7
  174. data/lib/active_record/relation/where_clause.rb +174 -0
  175. data/lib/active_record/relation/where_clause_factory.rb +38 -0
  176. data/lib/active_record/result.rb +4 -3
  177. data/lib/active_record/runtime_registry.rb +1 -1
  178. data/lib/active_record/sanitization.rb +95 -66
  179. data/lib/active_record/schema.rb +26 -22
  180. data/lib/active_record/schema_dumper.rb +62 -38
  181. data/lib/active_record/schema_migration.rb +11 -14
  182. data/lib/active_record/scoping.rb +32 -15
  183. data/lib/active_record/scoping/default.rb +23 -9
  184. data/lib/active_record/scoping/named.rb +49 -28
  185. data/lib/active_record/secure_token.rb +38 -0
  186. data/lib/active_record/serialization.rb +2 -4
  187. data/lib/active_record/statement_cache.rb +16 -14
  188. data/lib/active_record/store.rb +8 -3
  189. data/lib/active_record/suppressor.rb +58 -0
  190. data/lib/active_record/table_metadata.rb +68 -0
  191. data/lib/active_record/tasks/database_tasks.rb +57 -43
  192. data/lib/active_record/tasks/mysql_database_tasks.rb +6 -14
  193. data/lib/active_record/tasks/postgresql_database_tasks.rb +11 -2
  194. data/lib/active_record/tasks/sqlite_database_tasks.rb +5 -1
  195. data/lib/active_record/timestamp.rb +20 -9
  196. data/lib/active_record/touch_later.rb +58 -0
  197. data/lib/active_record/transactions.rb +138 -56
  198. data/lib/active_record/type.rb +66 -17
  199. data/lib/active_record/type/adapter_specific_registry.rb +130 -0
  200. data/lib/active_record/type/date.rb +2 -45
  201. data/lib/active_record/type/date_time.rb +2 -49
  202. data/lib/active_record/type/internal/abstract_json.rb +29 -0
  203. data/lib/active_record/type/internal/timezone.rb +15 -0
  204. data/lib/active_record/type/serialized.rb +15 -14
  205. data/lib/active_record/type/time.rb +10 -16
  206. data/lib/active_record/type/type_map.rb +4 -4
  207. data/lib/active_record/type_caster.rb +7 -0
  208. data/lib/active_record/type_caster/connection.rb +29 -0
  209. data/lib/active_record/type_caster/map.rb +19 -0
  210. data/lib/active_record/validations.rb +33 -32
  211. data/lib/active_record/validations/absence.rb +23 -0
  212. data/lib/active_record/validations/associated.rb +10 -3
  213. data/lib/active_record/validations/length.rb +24 -0
  214. data/lib/active_record/validations/presence.rb +11 -12
  215. data/lib/active_record/validations/uniqueness.rb +30 -29
  216. data/lib/rails/generators/active_record/migration.rb +7 -0
  217. data/lib/rails/generators/active_record/migration/migration_generator.rb +7 -4
  218. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +8 -3
  219. data/lib/rails/generators/active_record/migration/templates/migration.rb +8 -1
  220. data/lib/rails/generators/active_record/model/model_generator.rb +32 -15
  221. data/lib/rails/generators/active_record/model/templates/application_record.rb +5 -0
  222. data/lib/rails/generators/active_record/model/templates/model.rb +3 -0
  223. metadata +59 -34
  224. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -498
  225. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  226. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +0 -11
  227. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  228. data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +0 -13
  229. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
  230. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  231. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  232. data/lib/active_record/type/big_integer.rb +0 -13
  233. data/lib/active_record/type/binary.rb +0 -50
  234. data/lib/active_record/type/boolean.rb +0 -31
  235. data/lib/active_record/type/decimal.rb +0 -64
  236. data/lib/active_record/type/decimal_without_scale.rb +0 -11
  237. data/lib/active_record/type/decorator.rb +0 -14
  238. data/lib/active_record/type/float.rb +0 -19
  239. data/lib/active_record/type/integer.rb +0 -59
  240. data/lib/active_record/type/mutable.rb +0 -16
  241. data/lib/active_record/type/numeric.rb +0 -36
  242. data/lib/active_record/type/string.rb +0 -40
  243. data/lib/active_record/type/text.rb +0 -11
  244. data/lib/active_record/type/time_value.rb +0 -38
  245. data/lib/active_record/type/unsigned_integer.rb +0 -15
  246. data/lib/active_record/type/value.rb +0 -110
@@ -1,93 +0,0 @@
1
- module ActiveRecord
2
- module ConnectionAdapters
3
- module PostgreSQL
4
- module ArrayParser # :nodoc:
5
-
6
- DOUBLE_QUOTE = '"'
7
- BACKSLASH = "\\"
8
- COMMA = ','
9
- BRACKET_OPEN = '{'
10
- BRACKET_CLOSE = '}'
11
-
12
- def parse_pg_array(string) # :nodoc:
13
- local_index = 0
14
- array = []
15
- while(local_index < string.length)
16
- case string[local_index]
17
- when BRACKET_OPEN
18
- local_index,array = parse_array_contents(array, string, local_index + 1)
19
- when BRACKET_CLOSE
20
- return array
21
- end
22
- local_index += 1
23
- end
24
-
25
- array
26
- end
27
-
28
- private
29
-
30
- def parse_array_contents(array, string, index)
31
- is_escaping = false
32
- is_quoted = false
33
- was_quoted = false
34
- current_item = ''
35
-
36
- local_index = index
37
- while local_index
38
- token = string[local_index]
39
- if is_escaping
40
- current_item << token
41
- is_escaping = false
42
- else
43
- if is_quoted
44
- case token
45
- when DOUBLE_QUOTE
46
- is_quoted = false
47
- was_quoted = true
48
- when BACKSLASH
49
- is_escaping = true
50
- else
51
- current_item << token
52
- end
53
- else
54
- case token
55
- when BACKSLASH
56
- is_escaping = true
57
- when COMMA
58
- add_item_to_array(array, current_item, was_quoted)
59
- current_item = ''
60
- was_quoted = false
61
- when DOUBLE_QUOTE
62
- is_quoted = true
63
- when BRACKET_OPEN
64
- internal_items = []
65
- local_index,internal_items = parse_array_contents(internal_items, string, local_index + 1)
66
- array.push(internal_items)
67
- when BRACKET_CLOSE
68
- add_item_to_array(array, current_item, was_quoted)
69
- return local_index,array
70
- else
71
- current_item << token
72
- end
73
- end
74
- end
75
-
76
- local_index += 1
77
- end
78
- return local_index,array
79
- end
80
-
81
- def add_item_to_array(array, current_item, quoted)
82
- return if !quoted && current_item.length == 0
83
-
84
- if !quoted && current_item == 'NULL'
85
- array.push nil
86
- else
87
- array.push current_item
88
- end
89
- end
90
- end
91
- end
92
- end
93
- end
@@ -1,11 +0,0 @@
1
- module ActiveRecord
2
- module ConnectionAdapters
3
- module PostgreSQL
4
- module OID # :nodoc:
5
- class Date < Type::Date # :nodoc:
6
- include Infinity
7
- end
8
- end
9
- end
10
- end
11
- end
@@ -1,21 +0,0 @@
1
- module ActiveRecord
2
- module ConnectionAdapters
3
- module PostgreSQL
4
- module OID # :nodoc:
5
- class Float < Type::Float # :nodoc:
6
- include Infinity
7
-
8
- def cast_value(value)
9
- case value
10
- when ::Float then value
11
- when 'Infinity' then ::Float::INFINITY
12
- when '-Infinity' then -::Float::INFINITY
13
- when 'NaN' then ::Float::NAN
14
- else value.to_f
15
- end
16
- end
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,13 +0,0 @@
1
- module ActiveRecord
2
- module ConnectionAdapters
3
- module PostgreSQL
4
- module OID # :nodoc:
5
- module Infinity # :nodoc:
6
- def infinity(options = {})
7
- options[:negative] ? -::Float::INFINITY : ::Float::INFINITY
8
- end
9
- end
10
- end
11
- end
12
- end
13
- end
@@ -1,11 +0,0 @@
1
- module ActiveRecord
2
- module ConnectionAdapters
3
- module PostgreSQL
4
- module OID # :nodoc:
5
- class Integer < Type::Integer # :nodoc:
6
- include Infinity
7
- end
8
- end
9
- end
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- module ActiveRecord
2
- module ConnectionAdapters
3
- module PostgreSQL
4
- module OID # :nodoc:
5
- class Time < Type::Time # :nodoc:
6
- include Infinity
7
- end
8
- end
9
- end
10
- end
11
- end
@@ -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,31 +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
- (#{value.inspect})
20
- to a boolean column. Currently this value casts to `false`. This will
21
- change to match Ruby's semantics, and will cast to `true` in Rails 5.
22
- If you would like to maintain the current behavior, you should
23
- explicitly handle the values you would like cast to `false`.
24
- MSG
25
- end
26
- false
27
- end
28
- end
29
- end
30
- end
31
- end