activerecord 5.1.7 → 5.2.0.beta1
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 +221 -900
- data/README.rdoc +3 -3
- data/examples/performance.rb +2 -0
- data/examples/simple.rb +2 -0
- data/lib/active_record.rb +10 -3
- data/lib/active_record/aggregations.rb +2 -0
- data/lib/active_record/association_relation.rb +2 -0
- data/lib/active_record/associations.rb +13 -42
- data/lib/active_record/associations/alias_tracker.rb +17 -17
- data/lib/active_record/associations/association.rb +11 -22
- data/lib/active_record/associations/association_scope.rb +32 -44
- data/lib/active_record/associations/belongs_to_association.rb +6 -4
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +3 -1
- data/lib/active_record/associations/builder/association.rb +2 -5
- data/lib/active_record/associations/builder/belongs_to.rb +7 -12
- data/lib/active_record/associations/builder/collection_association.rb +1 -1
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -1
- data/lib/active_record/associations/builder/has_many.rb +2 -0
- data/lib/active_record/associations/builder/has_one.rb +2 -0
- data/lib/active_record/associations/builder/singular_association.rb +2 -0
- data/lib/active_record/associations/collection_association.rb +41 -33
- data/lib/active_record/associations/collection_proxy.rb +11 -14
- data/lib/active_record/associations/foreign_association.rb +2 -0
- data/lib/active_record/associations/has_many_association.rb +4 -2
- data/lib/active_record/associations/has_many_through_association.rb +4 -2
- data/lib/active_record/associations/has_one_association.rb +3 -1
- data/lib/active_record/associations/has_one_through_association.rb +3 -1
- data/lib/active_record/associations/join_dependency.rb +22 -40
- data/lib/active_record/associations/join_dependency/join_association.rb +17 -56
- data/lib/active_record/associations/join_dependency/join_base.rb +9 -8
- data/lib/active_record/associations/join_dependency/join_part.rb +2 -9
- data/lib/active_record/associations/preloader.rb +17 -37
- data/lib/active_record/associations/preloader/association.rb +42 -58
- data/lib/active_record/associations/preloader/through_association.rb +71 -79
- data/lib/active_record/associations/singular_association.rb +14 -10
- data/lib/active_record/associations/through_association.rb +3 -1
- data/lib/active_record/attribute_assignment.rb +2 -0
- data/lib/active_record/attribute_decorators.rb +3 -2
- data/lib/active_record/attribute_methods.rb +47 -7
- data/lib/active_record/attribute_methods/before_type_cast.rb +2 -0
- data/lib/active_record/attribute_methods/dirty.rb +25 -214
- data/lib/active_record/attribute_methods/primary_key.rb +7 -6
- data/lib/active_record/attribute_methods/query.rb +2 -0
- data/lib/active_record/attribute_methods/read.rb +8 -2
- data/lib/active_record/attribute_methods/serialization.rb +23 -0
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +6 -8
- data/lib/active_record/attribute_methods/write.rb +21 -9
- data/lib/active_record/attributes.rb +7 -6
- data/lib/active_record/autosave_association.rb +5 -11
- data/lib/active_record/base.rb +2 -0
- data/lib/active_record/callbacks.rb +6 -8
- data/lib/active_record/coders/json.rb +2 -0
- data/lib/active_record/coders/yaml_column.rb +2 -0
- data/lib/active_record/collection_cache_key.rb +10 -5
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +110 -35
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +120 -28
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +7 -2
- data/lib/active_record/connection_adapters/abstract/quoting.rb +14 -33
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +13 -5
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +40 -2
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +31 -53
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +103 -63
- data/lib/active_record/connection_adapters/abstract/transaction.rb +45 -9
- data/lib/active_record/connection_adapters/abstract_adapter.rb +62 -90
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +75 -138
- data/lib/active_record/connection_adapters/column.rb +3 -1
- data/lib/active_record/connection_adapters/connection_specification.rb +17 -3
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +2 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +2 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +3 -1
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +2 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +9 -10
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +5 -3
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +7 -6
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +30 -30
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +91 -1
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +2 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +8 -2
- data/lib/active_record/connection_adapters/postgresql/column.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +6 -0
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -1
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +3 -11
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +3 -5
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +4 -2
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +10 -0
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +19 -25
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +11 -7
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +20 -13
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +79 -65
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +47 -82
- data/lib/active_record/connection_adapters/schema_cache.rb +2 -0
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +2 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +2 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +19 -2
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +2 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +6 -15
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +3 -2
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +71 -1
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +34 -89
- data/lib/active_record/connection_adapters/statement_pool.rb +2 -0
- data/lib/active_record/connection_handling.rb +4 -2
- data/lib/active_record/core.rb +27 -57
- data/lib/active_record/counter_cache.rb +15 -12
- data/lib/active_record/define_callbacks.rb +5 -3
- data/lib/active_record/dynamic_matchers.rb +9 -9
- data/lib/active_record/enum.rb +15 -13
- data/lib/active_record/errors.rb +54 -21
- data/lib/active_record/explain.rb +3 -1
- data/lib/active_record/explain_registry.rb +2 -0
- data/lib/active_record/explain_subscriber.rb +2 -0
- data/lib/active_record/fixture_set/file.rb +2 -0
- data/lib/active_record/fixtures.rb +40 -24
- data/lib/active_record/gem_version.rb +5 -3
- data/lib/active_record/inheritance.rb +6 -5
- data/lib/active_record/integration.rb +58 -19
- data/lib/active_record/internal_metadata.rb +2 -0
- data/lib/active_record/legacy_yaml_adapter.rb +3 -1
- data/lib/active_record/locking/optimistic.rb +31 -20
- data/lib/active_record/locking/pessimistic.rb +10 -7
- data/lib/active_record/log_subscriber.rb +2 -0
- data/lib/active_record/migration.rb +47 -21
- data/lib/active_record/migration/command_recorder.rb +11 -9
- data/lib/active_record/migration/compatibility.rb +20 -2
- data/lib/active_record/migration/join_table.rb +2 -0
- data/lib/active_record/model_schema.rb +29 -38
- data/lib/active_record/nested_attributes.rb +18 -6
- data/lib/active_record/no_touching.rb +3 -1
- data/lib/active_record/null_relation.rb +2 -0
- data/lib/active_record/persistence.rb +184 -40
- data/lib/active_record/query_cache.rb +17 -12
- data/lib/active_record/querying.rb +3 -1
- data/lib/active_record/railtie.rb +54 -1
- data/lib/active_record/railties/console_sandbox.rb +2 -0
- data/lib/active_record/railties/controller_runtime.rb +2 -0
- data/lib/active_record/railties/databases.rake +41 -28
- data/lib/active_record/readonly_attributes.rb +3 -2
- data/lib/active_record/reflection.rb +100 -182
- data/lib/active_record/relation.rb +61 -193
- data/lib/active_record/relation/batches.rb +20 -5
- data/lib/active_record/relation/batches/batch_enumerator.rb +2 -0
- data/lib/active_record/relation/calculations.rb +40 -23
- data/lib/active_record/relation/delegation.rb +10 -27
- data/lib/active_record/relation/finder_methods.rb +53 -49
- data/lib/active_record/relation/from_clause.rb +2 -8
- data/lib/active_record/relation/merger.rb +22 -19
- data/lib/active_record/relation/predicate_builder.rb +42 -79
- data/lib/active_record/relation/predicate_builder/array_handler.rb +10 -7
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +46 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +2 -2
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +12 -1
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +54 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -6
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
- data/lib/active_record/relation/query_attribute.rb +9 -2
- data/lib/active_record/relation/query_methods.rb +80 -69
- data/lib/active_record/relation/record_fetch_warning.rb +2 -0
- data/lib/active_record/relation/spawn_methods.rb +2 -0
- data/lib/active_record/relation/where_clause.rb +50 -67
- data/lib/active_record/relation/where_clause_factory.rb +4 -46
- data/lib/active_record/result.rb +2 -0
- data/lib/active_record/runtime_registry.rb +2 -0
- data/lib/active_record/sanitization.rb +15 -9
- data/lib/active_record/schema.rb +3 -1
- data/lib/active_record/schema_dumper.rb +24 -23
- data/lib/active_record/schema_migration.rb +2 -0
- data/lib/active_record/scoping.rb +9 -8
- data/lib/active_record/scoping/default.rb +6 -7
- data/lib/active_record/scoping/named.rb +15 -7
- data/lib/active_record/secure_token.rb +2 -0
- data/lib/active_record/serialization.rb +2 -0
- data/lib/active_record/statement_cache.rb +22 -12
- data/lib/active_record/store.rb +2 -0
- data/lib/active_record/suppressor.rb +2 -0
- data/lib/active_record/table_metadata.rb +3 -1
- data/lib/active_record/tasks/database_tasks.rb +23 -12
- data/lib/active_record/tasks/mysql_database_tasks.rb +9 -48
- data/lib/active_record/tasks/postgresql_database_tasks.rb +10 -2
- data/lib/active_record/tasks/sqlite_database_tasks.rb +25 -3
- data/lib/active_record/timestamp.rb +5 -12
- data/lib/active_record/touch_later.rb +2 -0
- data/lib/active_record/transactions.rb +9 -7
- data/lib/active_record/translation.rb +2 -0
- data/lib/active_record/type.rb +4 -1
- data/lib/active_record/type/adapter_specific_registry.rb +2 -0
- data/lib/active_record/type/date.rb +2 -0
- data/lib/active_record/type/date_time.rb +2 -0
- data/lib/active_record/type/decimal_without_scale.rb +2 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +2 -0
- data/lib/active_record/type/internal/timezone.rb +2 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +2 -4
- data/lib/active_record/type/text.rb +2 -0
- data/lib/active_record/type/time.rb +2 -0
- data/lib/active_record/type/type_map.rb +2 -0
- data/lib/active_record/type/unsigned_integer.rb +2 -0
- data/lib/active_record/type_caster.rb +2 -0
- data/lib/active_record/type_caster/connection.rb +2 -0
- data/lib/active_record/type_caster/map.rb +2 -0
- data/lib/active_record/validations.rb +2 -0
- data/lib/active_record/validations/absence.rb +2 -0
- data/lib/active_record/validations/associated.rb +2 -0
- data/lib/active_record/validations/length.rb +2 -0
- data/lib/active_record/validations/presence.rb +2 -0
- data/lib/active_record/validations/uniqueness.rb +36 -6
- data/lib/active_record/version.rb +2 -0
- data/lib/rails/generators/active_record.rb +3 -1
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
- data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
- data/lib/rails/generators/active_record/migration.rb +2 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +3 -1
- data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +0 -0
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +0 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +2 -23
- data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +0 -0
- data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
- metadata +25 -38
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -15
- data/lib/active_record/associations/preloader/collection_association.rb +0 -17
- data/lib/active_record/associations/preloader/has_many.rb +0 -15
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
- data/lib/active_record/associations/preloader/has_one.rb +0 -15
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -18
- data/lib/active_record/attribute.rb +0 -240
- data/lib/active_record/attribute/user_provided_default.rb +0 -30
- data/lib/active_record/attribute_mutation_tracker.rb +0 -122
- data/lib/active_record/attribute_set.rb +0 -113
- data/lib/active_record/attribute_set/builder.rb +0 -126
- data/lib/active_record/attribute_set/yaml_encoder.rb +0 -41
- data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -10
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -59
- data/lib/active_record/type/internal/abstract_json.rb +0 -37
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Tasks # :nodoc:
|
3
5
|
class SQLiteDatabaseTasks # :nodoc:
|
@@ -36,9 +38,18 @@ module ActiveRecord
|
|
36
38
|
end
|
37
39
|
|
38
40
|
def structure_dump(filename, extra_flags)
|
39
|
-
|
40
|
-
|
41
|
-
|
41
|
+
args = []
|
42
|
+
args.concat(Array(extra_flags)) if extra_flags
|
43
|
+
args << configuration["database"]
|
44
|
+
|
45
|
+
ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
|
46
|
+
if ignore_tables.any?
|
47
|
+
condition = ignore_tables.map { |table| connection.quote(table) }.join(", ")
|
48
|
+
args << "SELECT sql FROM sqlite_master WHERE tbl_name NOT IN (#{condition}) ORDER BY tbl_name, type DESC, name"
|
49
|
+
else
|
50
|
+
args << ".schema"
|
51
|
+
end
|
52
|
+
run_cmd("sqlite3", args, filename)
|
42
53
|
end
|
43
54
|
|
44
55
|
def structure_load(filename, extra_flags)
|
@@ -56,6 +67,17 @@ module ActiveRecord
|
|
56
67
|
def root
|
57
68
|
@root
|
58
69
|
end
|
70
|
+
|
71
|
+
def run_cmd(cmd, args, out)
|
72
|
+
fail run_cmd_error(cmd, args) unless Kernel.system(cmd, *args, out: out)
|
73
|
+
end
|
74
|
+
|
75
|
+
def run_cmd_error(cmd, args)
|
76
|
+
msg = "failed to execute:\n".dup
|
77
|
+
msg << "#{cmd} #{args.join(' ')}\n\n"
|
78
|
+
msg << "Please check the output above for any errors and make sure that `#{cmd}` is installed in your PATH and has proper permissions.\n\n"
|
79
|
+
msg
|
80
|
+
end
|
59
81
|
end
|
60
82
|
end
|
61
83
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module ActiveRecord
|
3
4
|
# = Active Record \Timestamp
|
4
5
|
#
|
@@ -43,8 +44,7 @@ module ActiveRecord
|
|
43
44
|
extend ActiveSupport::Concern
|
44
45
|
|
45
46
|
included do
|
46
|
-
class_attribute :record_timestamps
|
47
|
-
self.record_timestamps = true
|
47
|
+
class_attribute :record_timestamps, default: true
|
48
48
|
end
|
49
49
|
|
50
50
|
def initialize_dup(other) # :nodoc:
|
@@ -53,13 +53,6 @@ module ActiveRecord
|
|
53
53
|
end
|
54
54
|
|
55
55
|
class_methods do
|
56
|
-
def touch_attributes_with_time(*names, time: nil)
|
57
|
-
attribute_names = timestamp_attributes_for_update_in_model
|
58
|
-
attribute_names |= names.map(&:to_s)
|
59
|
-
time ||= current_time_from_proper_timezone
|
60
|
-
attribute_names.each_with_object({}) { |attr_name, result| result[attr_name] = time }
|
61
|
-
end
|
62
|
-
|
63
56
|
private
|
64
57
|
def timestamp_attributes_for_create_in_model
|
65
58
|
timestamp_attributes_for_create.select { |c| column_names.include?(c) }
|
@@ -94,7 +87,7 @@ module ActiveRecord
|
|
94
87
|
|
95
88
|
all_timestamp_attributes_in_model.each do |column|
|
96
89
|
if !attribute_present?(column)
|
97
|
-
|
90
|
+
_write_attribute(column, current_time)
|
98
91
|
end
|
99
92
|
end
|
100
93
|
end
|
@@ -108,7 +101,7 @@ module ActiveRecord
|
|
108
101
|
|
109
102
|
timestamp_attributes_for_update_in_model.each do |column|
|
110
103
|
next if will_save_change_to_attribute?(column)
|
111
|
-
|
104
|
+
_write_attribute(column, current_time)
|
112
105
|
end
|
113
106
|
end
|
114
107
|
super(*args)
|
@@ -134,7 +127,7 @@ module ActiveRecord
|
|
134
127
|
self.class.send(:current_time_from_proper_timezone)
|
135
128
|
end
|
136
129
|
|
137
|
-
def max_updated_column_timestamp(timestamp_names =
|
130
|
+
def max_updated_column_timestamp(timestamp_names = timestamp_attributes_for_update_in_model)
|
138
131
|
timestamp_names
|
139
132
|
.map { |attr| self[attr] }
|
140
133
|
.compact
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
# See ActiveRecord::Transactions::ClassMethods for documentation.
|
3
5
|
module Transactions
|
@@ -168,7 +170,7 @@ module ActiveRecord
|
|
168
170
|
# writing, the only database that we're aware of that supports true nested
|
169
171
|
# transactions, is MS-SQL. Because of this, Active Record emulates nested
|
170
172
|
# transactions by using savepoints on MySQL and PostgreSQL. See
|
171
|
-
#
|
173
|
+
# https://dev.mysql.com/doc/refman/5.7/en/savepoint.html
|
172
174
|
# for more information about savepoints.
|
173
175
|
#
|
174
176
|
# === \Callbacks
|
@@ -188,7 +190,7 @@ module ActiveRecord
|
|
188
190
|
#
|
189
191
|
# === Caveats
|
190
192
|
#
|
191
|
-
# If you're on MySQL, then do not use Data Definition Language(DDL) operations in nested
|
193
|
+
# If you're on MySQL, then do not use Data Definition Language (DDL) operations in nested
|
192
194
|
# transactions blocks that are emulated with savepoints. That is, do not execute statements
|
193
195
|
# like 'CREATE TABLE' inside such blocks. This is because MySQL automatically
|
194
196
|
# releases all savepoints upon executing a DDL operation. When +transaction+
|
@@ -283,7 +285,7 @@ module ActiveRecord
|
|
283
285
|
fire_on = Array(options[:on])
|
284
286
|
assert_valid_transaction_action(fire_on)
|
285
287
|
options[:if] = Array(options[:if])
|
286
|
-
options[:if].unshift(
|
288
|
+
options[:if].unshift(-> { transaction_include_any_action?(fire_on) })
|
287
289
|
end
|
288
290
|
end
|
289
291
|
|
@@ -430,8 +432,8 @@ module ActiveRecord
|
|
430
432
|
@new_record = restore_state[:new_record]
|
431
433
|
@destroyed = restore_state[:destroyed]
|
432
434
|
pk = self.class.primary_key
|
433
|
-
if pk &&
|
434
|
-
|
435
|
+
if pk && _read_attribute(pk) != restore_state[:id]
|
436
|
+
_write_attribute(pk, restore_state[:id])
|
435
437
|
end
|
436
438
|
freeze if restore_state[:frozen?]
|
437
439
|
end
|
@@ -470,7 +472,7 @@ module ActiveRecord
|
|
470
472
|
# if it's associated with a transaction, then the state of the Active Record
|
471
473
|
# object will be updated to reflect the current state of the transaction.
|
472
474
|
#
|
473
|
-
# The
|
475
|
+
# The <tt>@transaction_state</tt> variable stores the states of the associated
|
474
476
|
# transaction. This relies on the fact that a transaction can only be in
|
475
477
|
# one rollback or commit (otherwise a list of states would be required).
|
476
478
|
# Each Active Record object inside of a transaction carries that transaction's
|
@@ -490,7 +492,7 @@ module ActiveRecord
|
|
490
492
|
def update_attributes_from_transaction_state(transaction_state)
|
491
493
|
if transaction_state && transaction_state.finalized?
|
492
494
|
restore_transaction_record_state if transaction_state.rolledback?
|
493
|
-
clear_transaction_record_state
|
495
|
+
clear_transaction_record_state if transaction_state.fully_completed?
|
494
496
|
end
|
495
497
|
end
|
496
498
|
end
|
data/lib/active_record/type.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_model/type"
|
2
4
|
|
3
|
-
require "active_record/type/internal/abstract_json"
|
4
5
|
require "active_record/type/internal/timezone"
|
5
6
|
|
6
7
|
require "active_record/type/date"
|
7
8
|
require "active_record/type/date_time"
|
8
9
|
require "active_record/type/decimal_without_scale"
|
10
|
+
require "active_record/type/json"
|
9
11
|
require "active_record/type/time"
|
10
12
|
require "active_record/type/text"
|
11
13
|
require "active_record/type/unsigned_integer"
|
@@ -69,6 +71,7 @@ module ActiveRecord
|
|
69
71
|
register(:decimal, Type::Decimal, override: false)
|
70
72
|
register(:float, Type::Float, override: false)
|
71
73
|
register(:integer, Type::Integer, override: false)
|
74
|
+
register(:json, Type::Json, override: false)
|
72
75
|
register(:string, Type::String, override: false)
|
73
76
|
register(:text, Type::Text, override: false)
|
74
77
|
register(:time, Type::Time, override: false)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module Type
|
5
|
+
class Json < ActiveModel::Type::Value
|
6
|
+
include ActiveModel::Type::Helpers::Mutable
|
7
|
+
|
8
|
+
def type
|
9
|
+
:json
|
10
|
+
end
|
11
|
+
|
12
|
+
def deserialize(value)
|
13
|
+
return value unless value.is_a?(::String)
|
14
|
+
ActiveSupport::JSON.decode(value) rescue nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def serialize(value)
|
18
|
+
ActiveSupport::JSON.encode(value) unless value.nil?
|
19
|
+
end
|
20
|
+
|
21
|
+
def changed_in_place?(raw_old_value, new_value)
|
22
|
+
deserialize(raw_old_value) != new_value
|
23
|
+
end
|
24
|
+
|
25
|
+
def accessor
|
26
|
+
ActiveRecord::Store::StringKeyedHashAccessor
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Type
|
3
5
|
class Serialized < DelegateClass(ActiveModel::Type::Value) # :nodoc:
|
@@ -49,10 +51,6 @@ module ActiveRecord
|
|
49
51
|
end
|
50
52
|
end
|
51
53
|
|
52
|
-
def force_equality?(value)
|
53
|
-
coder.respond_to?(:object_class) && value.is_a?(coder.object_class)
|
54
|
-
end
|
55
|
-
|
56
54
|
private
|
57
55
|
|
58
56
|
def default_value?(value)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Validations
|
3
5
|
class UniquenessValidator < ActiveModel::EachValidator # :nodoc:
|
@@ -6,6 +8,10 @@ module ActiveRecord
|
|
6
8
|
raise ArgumentError, "#{options[:conditions]} was passed as :conditions but is not callable. " \
|
7
9
|
"Pass a callable instead: `conditions: -> { where(approved: true) }`"
|
8
10
|
end
|
11
|
+
unless Array(options[:scope]).all? { |scope| scope.respond_to?(:to_sym) }
|
12
|
+
raise ArgumentError, "#{options[:scope]} is not supported format for :scope option. " \
|
13
|
+
"Pass a symbol or an array of symbols instead: `scope: :user_id`"
|
14
|
+
end
|
9
15
|
super({ case_sensitive: true }.merge!(options))
|
10
16
|
@klass = options[:class]
|
11
17
|
end
|
@@ -17,7 +23,7 @@ module ActiveRecord
|
|
17
23
|
relation = build_relation(finder_class, attribute, value)
|
18
24
|
if record.persisted?
|
19
25
|
if finder_class.primary_key
|
20
|
-
relation = relation.where.not(finder_class.primary_key => record.id_in_database)
|
26
|
+
relation = relation.where.not(finder_class.primary_key => record.id_in_database || record.id)
|
21
27
|
else
|
22
28
|
raise UnknownPrimaryKey.new(finder_class, "Can not validate uniqueness for persisted record without primary key.")
|
23
29
|
end
|
@@ -50,7 +56,33 @@ module ActiveRecord
|
|
50
56
|
end
|
51
57
|
|
52
58
|
def build_relation(klass, attribute, value)
|
53
|
-
klass.
|
59
|
+
if reflection = klass._reflect_on_association(attribute)
|
60
|
+
attribute = reflection.foreign_key
|
61
|
+
value = value.attributes[reflection.klass.primary_key] unless value.nil?
|
62
|
+
end
|
63
|
+
|
64
|
+
if value.nil?
|
65
|
+
return klass.unscoped.where!(attribute => value)
|
66
|
+
end
|
67
|
+
|
68
|
+
# the attribute may be an aliased attribute
|
69
|
+
if klass.attribute_alias?(attribute)
|
70
|
+
attribute = klass.attribute_alias(attribute)
|
71
|
+
end
|
72
|
+
|
73
|
+
attribute_name = attribute.to_s
|
74
|
+
value = klass.predicate_builder.build_bind_attribute(attribute_name, value)
|
75
|
+
|
76
|
+
table = klass.arel_table
|
77
|
+
column = klass.columns_hash[attribute_name]
|
78
|
+
|
79
|
+
comparison = if !options[:case_sensitive]
|
80
|
+
# will use SQL LOWER function before comparison, unless it detects a case insensitive collation
|
81
|
+
klass.connection.case_insensitive_comparison(table, attribute, column, value)
|
82
|
+
else
|
83
|
+
klass.connection.case_sensitive_comparison(table, attribute, column, value)
|
84
|
+
end
|
85
|
+
klass.unscoped.where!(comparison)
|
54
86
|
end
|
55
87
|
|
56
88
|
def scope_relation(record, relation)
|
@@ -173,9 +205,7 @@ module ActiveRecord
|
|
173
205
|
# | # Boom! We now have a duplicate
|
174
206
|
# | # title!
|
175
207
|
#
|
176
|
-
#
|
177
|
-
# isolation level. The best way to work around this problem is to add a unique
|
178
|
-
# index to the database table using
|
208
|
+
# The best way to work around this problem is to add a unique index to the database table using
|
179
209
|
# {connection.add_index}[rdoc-ref:ConnectionAdapters::SchemaStatements#add_index].
|
180
210
|
# In the rare case that a race condition occurs, the database will guarantee
|
181
211
|
# the field's uniqueness.
|
@@ -187,7 +217,7 @@ module ActiveRecord
|
|
187
217
|
# can catch it and restart the transaction (e.g. by telling the user
|
188
218
|
# that the title already exists, and asking them to re-enter the title).
|
189
219
|
# This technique is also known as
|
190
|
-
# {optimistic concurrency control}[
|
220
|
+
# {optimistic concurrency control}[https://en.wikipedia.org/wiki/Optimistic_concurrency_control].
|
191
221
|
#
|
192
222
|
# The bundled ActiveRecord::ConnectionAdapters distinguish unique index
|
193
223
|
# constraint errors from other types of database errors by throwing an
|