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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +1282 -1195
- 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.rb +8 -4
- data/lib/active_record/aggregations.rb +35 -24
- data/lib/active_record/association_relation.rb +3 -3
- data/lib/active_record/associations.rb +317 -209
- 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.rb +29 -19
- data/lib/active_record/associations/join_dependency/join_association.rb +16 -10
- data/lib/active_record/associations/preloader.rb +14 -4
- 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/singular_association.rb +7 -1
- data/lib/active_record/associations/through_association.rb +11 -3
- data/lib/active_record/attribute.rb +68 -18
- data/lib/active_record/attribute/user_provided_default.rb +28 -0
- data/lib/active_record/attribute_assignment.rb +19 -140
- data/lib/active_record/attribute_decorators.rb +6 -5
- data/lib/active_record/attribute_methods.rb +76 -47
- 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_mutation_tracker.rb +70 -0
- data/lib/active_record/attribute_set.rb +30 -3
- data/lib/active_record/attribute_set/builder.rb +6 -4
- 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.rb +1 -6
- 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/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.rb +363 -133
- data/lib/active_record/migration/command_recorder.rb +59 -18
- data/lib/active_record/migration/compatibility.rb +126 -0
- 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.rb +176 -116
- data/lib/active_record/relation/batches.rb +139 -34
- data/lib/active_record/relation/batches/batch_enumerator.rb +67 -0
- 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.rb +120 -107
- 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/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/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.rb +32 -15
- data/lib/active_record/scoping/default.rb +23 -9
- data/lib/active_record/scoping/named.rb +49 -28
- 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.rb +66 -17
- 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_caster.rb +7 -0
- data/lib/active_record/type_caster/connection.rb +29 -0
- data/lib/active_record/type_caster/map.rb +19 -0
- data/lib/active_record/validations.rb +33 -32
- 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/rails/generators/active_record/migration.rb +7 -0
- 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/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,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,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,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
|