activerecord 4.2.11.3 → 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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +1281 -1204
- data/MIT-LICENSE +2 -2
- data/README.rdoc +7 -8
- data/examples/performance.rb +2 -3
- data/examples/simple.rb +0 -1
- data/lib/active_record/aggregations.rb +35 -24
- data/lib/active_record/association_relation.rb +3 -3
- data/lib/active_record/associations/alias_tracker.rb +19 -16
- data/lib/active_record/associations/association.rb +11 -9
- data/lib/active_record/associations/association_scope.rb +73 -102
- data/lib/active_record/associations/belongs_to_association.rb +21 -32
- data/lib/active_record/associations/builder/association.rb +28 -34
- data/lib/active_record/associations/builder/belongs_to.rb +43 -18
- data/lib/active_record/associations/builder/collection_association.rb +7 -19
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +14 -11
- data/lib/active_record/associations/builder/has_many.rb +4 -4
- data/lib/active_record/associations/builder/has_one.rb +11 -6
- data/lib/active_record/associations/builder/singular_association.rb +3 -10
- data/lib/active_record/associations/collection_association.rb +49 -41
- data/lib/active_record/associations/collection_proxy.rb +67 -27
- data/lib/active_record/associations/foreign_association.rb +1 -1
- data/lib/active_record/associations/has_many_association.rb +20 -71
- data/lib/active_record/associations/has_many_through_association.rb +8 -47
- data/lib/active_record/associations/has_one_association.rb +12 -5
- data/lib/active_record/associations/join_dependency/join_association.rb +16 -10
- data/lib/active_record/associations/join_dependency.rb +29 -19
- data/lib/active_record/associations/preloader/association.rb +46 -52
- data/lib/active_record/associations/preloader/collection_association.rb +0 -6
- data/lib/active_record/associations/preloader/has_many_through.rb +1 -1
- data/lib/active_record/associations/preloader/has_one.rb +0 -8
- data/lib/active_record/associations/preloader/through_association.rb +27 -14
- data/lib/active_record/associations/preloader.rb +14 -4
- data/lib/active_record/associations/singular_association.rb +7 -1
- data/lib/active_record/associations/through_association.rb +11 -3
- data/lib/active_record/associations.rb +317 -209
- data/lib/active_record/attribute/user_provided_default.rb +28 -0
- data/lib/active_record/attribute.rb +68 -18
- data/lib/active_record/attribute_assignment.rb +19 -140
- data/lib/active_record/attribute_decorators.rb +6 -5
- data/lib/active_record/attribute_methods/before_type_cast.rb +1 -1
- data/lib/active_record/attribute_methods/dirty.rb +46 -86
- data/lib/active_record/attribute_methods/primary_key.rb +2 -2
- data/lib/active_record/attribute_methods/query.rb +2 -2
- data/lib/active_record/attribute_methods/read.rb +31 -59
- data/lib/active_record/attribute_methods/serialization.rb +13 -16
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +61 -14
- data/lib/active_record/attribute_methods/write.rb +13 -37
- data/lib/active_record/attribute_methods.rb +76 -47
- data/lib/active_record/attribute_mutation_tracker.rb +70 -0
- data/lib/active_record/attribute_set/builder.rb +6 -4
- data/lib/active_record/attribute_set.rb +30 -3
- data/lib/active_record/attributes.rb +199 -81
- data/lib/active_record/autosave_association.rb +49 -16
- data/lib/active_record/base.rb +32 -23
- data/lib/active_record/callbacks.rb +39 -43
- data/lib/active_record/coders/json.rb +1 -1
- data/lib/active_record/coders/yaml_column.rb +20 -8
- data/lib/active_record/collection_cache_key.rb +40 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +452 -182
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +65 -61
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -2
- data/lib/active_record/connection_adapters/abstract/quoting.rb +74 -10
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +61 -39
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +236 -185
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +72 -17
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +380 -141
- data/lib/active_record/connection_adapters/abstract/transaction.rb +51 -34
- data/lib/active_record/connection_adapters/abstract_adapter.rb +141 -59
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +401 -370
- data/lib/active_record/connection_adapters/column.rb +28 -43
- data/lib/active_record/connection_adapters/connection_specification.rb +15 -27
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +22 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +50 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +125 -0
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +70 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +51 -0
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +67 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +93 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +54 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +32 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +29 -166
- data/lib/active_record/connection_adapters/postgresql/column.rb +5 -10
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +10 -72
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +42 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +27 -57
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +7 -22
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +3 -3
- data/lib/active_record/connection_adapters/postgresql/oid/json.rb +1 -26
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +0 -4
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +4 -4
- data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +50 -0
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +31 -17
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +0 -4
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid.rb +1 -6
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +26 -18
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +29 -10
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -79
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +47 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +234 -148
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +35 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +248 -160
- data/lib/active_record/connection_adapters/schema_cache.rb +36 -23
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +32 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +19 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +48 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +22 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +149 -192
- data/lib/active_record/connection_adapters/statement_pool.rb +31 -12
- data/lib/active_record/connection_handling.rb +37 -14
- data/lib/active_record/core.rb +89 -107
- data/lib/active_record/counter_cache.rb +13 -24
- data/lib/active_record/dynamic_matchers.rb +1 -20
- data/lib/active_record/enum.rb +113 -76
- data/lib/active_record/errors.rb +87 -48
- data/lib/active_record/explain_registry.rb +1 -1
- data/lib/active_record/explain_subscriber.rb +1 -1
- data/lib/active_record/fixture_set/file.rb +26 -5
- data/lib/active_record/fixtures.rb +76 -40
- data/lib/active_record/gem_version.rb +4 -4
- data/lib/active_record/inheritance.rb +32 -40
- data/lib/active_record/integration.rb +4 -4
- data/lib/active_record/internal_metadata.rb +56 -0
- data/lib/active_record/legacy_yaml_adapter.rb +18 -2
- data/lib/active_record/locale/en.yml +3 -2
- data/lib/active_record/locking/optimistic.rb +15 -15
- data/lib/active_record/locking/pessimistic.rb +1 -1
- data/lib/active_record/log_subscriber.rb +43 -21
- data/lib/active_record/migration/command_recorder.rb +59 -18
- data/lib/active_record/migration/compatibility.rb +126 -0
- data/lib/active_record/migration.rb +363 -133
- data/lib/active_record/model_schema.rb +129 -41
- data/lib/active_record/nested_attributes.rb +58 -29
- data/lib/active_record/null_relation.rb +16 -8
- data/lib/active_record/persistence.rb +121 -80
- data/lib/active_record/query_cache.rb +15 -18
- data/lib/active_record/querying.rb +10 -9
- data/lib/active_record/railtie.rb +23 -16
- data/lib/active_record/railties/controller_runtime.rb +1 -1
- data/lib/active_record/railties/databases.rake +69 -46
- data/lib/active_record/readonly_attributes.rb +1 -1
- data/lib/active_record/reflection.rb +282 -115
- data/lib/active_record/relation/batches/batch_enumerator.rb +67 -0
- data/lib/active_record/relation/batches.rb +139 -34
- data/lib/active_record/relation/calculations.rb +79 -108
- data/lib/active_record/relation/delegation.rb +7 -20
- data/lib/active_record/relation/finder_methods.rb +163 -81
- data/lib/active_record/relation/from_clause.rb +32 -0
- data/lib/active_record/relation/merger.rb +16 -42
- data/lib/active_record/relation/predicate_builder/array_handler.rb +11 -16
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +88 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +17 -0
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +17 -0
- data/lib/active_record/relation/predicate_builder/class_handler.rb +27 -0
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +57 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +33 -0
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
- data/lib/active_record/relation/predicate_builder.rb +120 -107
- data/lib/active_record/relation/query_attribute.rb +19 -0
- data/lib/active_record/relation/query_methods.rb +308 -244
- data/lib/active_record/relation/record_fetch_warning.rb +49 -0
- data/lib/active_record/relation/spawn_methods.rb +4 -7
- data/lib/active_record/relation/where_clause.rb +174 -0
- data/lib/active_record/relation/where_clause_factory.rb +38 -0
- data/lib/active_record/relation.rb +176 -116
- data/lib/active_record/result.rb +4 -3
- data/lib/active_record/runtime_registry.rb +1 -1
- data/lib/active_record/sanitization.rb +95 -66
- data/lib/active_record/schema.rb +26 -22
- data/lib/active_record/schema_dumper.rb +62 -38
- data/lib/active_record/schema_migration.rb +11 -14
- data/lib/active_record/scoping/default.rb +23 -9
- data/lib/active_record/scoping/named.rb +49 -28
- data/lib/active_record/scoping.rb +32 -15
- data/lib/active_record/secure_token.rb +38 -0
- data/lib/active_record/serialization.rb +2 -4
- data/lib/active_record/statement_cache.rb +16 -14
- data/lib/active_record/store.rb +8 -3
- data/lib/active_record/suppressor.rb +58 -0
- data/lib/active_record/table_metadata.rb +68 -0
- data/lib/active_record/tasks/database_tasks.rb +57 -43
- data/lib/active_record/tasks/mysql_database_tasks.rb +6 -14
- data/lib/active_record/tasks/postgresql_database_tasks.rb +11 -2
- data/lib/active_record/tasks/sqlite_database_tasks.rb +5 -1
- data/lib/active_record/timestamp.rb +20 -9
- data/lib/active_record/touch_later.rb +58 -0
- data/lib/active_record/transactions.rb +138 -56
- data/lib/active_record/type/adapter_specific_registry.rb +130 -0
- data/lib/active_record/type/date.rb +2 -45
- data/lib/active_record/type/date_time.rb +2 -49
- data/lib/active_record/type/internal/abstract_json.rb +29 -0
- data/lib/active_record/type/internal/timezone.rb +15 -0
- data/lib/active_record/type/serialized.rb +15 -14
- data/lib/active_record/type/time.rb +10 -16
- data/lib/active_record/type/type_map.rb +4 -4
- data/lib/active_record/type.rb +66 -17
- data/lib/active_record/type_caster/connection.rb +29 -0
- data/lib/active_record/type_caster/map.rb +19 -0
- data/lib/active_record/type_caster.rb +7 -0
- data/lib/active_record/validations/absence.rb +23 -0
- data/lib/active_record/validations/associated.rb +10 -3
- data/lib/active_record/validations/length.rb +24 -0
- data/lib/active_record/validations/presence.rb +11 -12
- data/lib/active_record/validations/uniqueness.rb +30 -29
- data/lib/active_record/validations.rb +33 -32
- data/lib/active_record.rb +8 -4
- data/lib/rails/generators/active_record/migration/migration_generator.rb +7 -4
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +8 -3
- data/lib/rails/generators/active_record/migration/templates/migration.rb +8 -1
- data/lib/rails/generators/active_record/migration.rb +7 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +32 -15
- data/lib/rails/generators/active_record/model/templates/application_record.rb +5 -0
- data/lib/rails/generators/active_record/model/templates/model.rb +3 -0
- metadata +59 -34
- data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -498
- data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +0 -11
- data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
- data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +0 -13
- data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
- data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
- data/lib/active_record/serializers/xml_serializer.rb +0 -193
- data/lib/active_record/type/big_integer.rb +0 -13
- data/lib/active_record/type/binary.rb +0 -50
- data/lib/active_record/type/boolean.rb +0 -31
- data/lib/active_record/type/decimal.rb +0 -64
- data/lib/active_record/type/decimal_without_scale.rb +0 -11
- data/lib/active_record/type/decorator.rb +0 -14
- data/lib/active_record/type/float.rb +0 -19
- data/lib/active_record/type/integer.rb +0 -59
- data/lib/active_record/type/mutable.rb +0 -16
- data/lib/active_record/type/numeric.rb +0 -36
- data/lib/active_record/type/string.rb +0 -40
- data/lib/active_record/type/text.rb +0 -11
- data/lib/active_record/type/time_value.rb +0 -38
- data/lib/active_record/type/unsigned_integer.rb +0 -15
- data/lib/active_record/type/value.rb +0 -110
@@ -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,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
|
@@ -1,64 +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
|
-
casted_value = case value
|
18
|
-
when ::Float
|
19
|
-
convert_float_to_big_decimal(value)
|
20
|
-
when ::Numeric
|
21
|
-
BigDecimal(value, precision.to_i)
|
22
|
-
when ::String
|
23
|
-
begin
|
24
|
-
value.to_d
|
25
|
-
rescue ArgumentError
|
26
|
-
BigDecimal(0)
|
27
|
-
end
|
28
|
-
else
|
29
|
-
if value.respond_to?(:to_d)
|
30
|
-
value.to_d
|
31
|
-
else
|
32
|
-
cast_value(value.to_s)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
apply_scale(casted_value)
|
37
|
-
end
|
38
|
-
|
39
|
-
def convert_float_to_big_decimal(value)
|
40
|
-
if precision
|
41
|
-
BigDecimal(apply_scale(value), float_precision)
|
42
|
-
else
|
43
|
-
value.to_d
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def float_precision
|
48
|
-
if precision.to_i > ::Float::DIG + 1
|
49
|
-
::Float::DIG + 1
|
50
|
-
else
|
51
|
-
precision.to_i
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def apply_scale(value)
|
56
|
-
if scale
|
57
|
-
value.round(scale)
|
58
|
-
else
|
59
|
-
value
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
@@ -1,59 +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
|
-
def type_cast_from_database(value)
|
16
|
-
return if value.nil?
|
17
|
-
value.to_i
|
18
|
-
end
|
19
|
-
|
20
|
-
def type_cast_for_database(value)
|
21
|
-
result = type_cast(value)
|
22
|
-
if result
|
23
|
-
ensure_in_range(result)
|
24
|
-
end
|
25
|
-
result
|
26
|
-
end
|
27
|
-
|
28
|
-
protected
|
29
|
-
|
30
|
-
attr_reader :range
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def cast_value(value)
|
35
|
-
case value
|
36
|
-
when true then 1
|
37
|
-
when false then 0
|
38
|
-
else
|
39
|
-
value.to_i rescue nil
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def ensure_in_range(value)
|
44
|
-
unless range.cover?(value)
|
45
|
-
raise RangeError, "#{value} is out of range for #{self.class} with limit #{limit || 4}"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def max_value
|
50
|
-
limit = self.limit || 4
|
51
|
-
1 << (limit * 8 - 1) # 8 bits per byte with one bit for sign
|
52
|
-
end
|
53
|
-
|
54
|
-
def min_value
|
55
|
-
-max_value
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
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,40 +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
|
-
def text?
|
25
|
-
true
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def cast_value(value)
|
31
|
-
case value
|
32
|
-
when true then "t"
|
33
|
-
when false then "f"
|
34
|
-
# String.new is slightly faster than dup
|
35
|
-
else ::String.new(value.to_s)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
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
|