activerecord 5.1.7 → 5.2.4.3
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 +4 -4
- data/CHANGELOG.md +556 -685
- data/MIT-LICENSE +1 -1
- data/README.rdoc +5 -5
- data/examples/performance.rb +2 -0
- data/examples/simple.rb +2 -0
- data/lib/active_record.rb +11 -4
- data/lib/active_record/aggregations.rb +6 -5
- data/lib/active_record/association_relation.rb +7 -5
- data/lib/active_record/associations.rb +40 -63
- data/lib/active_record/associations/alias_tracker.rb +19 -27
- data/lib/active_record/associations/association.rb +41 -37
- data/lib/active_record/associations/association_scope.rb +38 -50
- data/lib/active_record/associations/belongs_to_association.rb +27 -8
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -8
- data/lib/active_record/associations/builder/association.rb +4 -7
- data/lib/active_record/associations/builder/belongs_to.rb +12 -4
- data/lib/active_record/associations/builder/collection_association.rb +3 -3
- 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 +59 -47
- data/lib/active_record/associations/collection_proxy.rb +20 -49
- data/lib/active_record/associations/foreign_association.rb +2 -0
- data/lib/active_record/associations/has_many_association.rb +12 -1
- data/lib/active_record/associations/has_many_through_association.rb +36 -30
- data/lib/active_record/associations/has_one_association.rb +12 -1
- data/lib/active_record/associations/has_one_through_association.rb +13 -8
- data/lib/active_record/associations/join_dependency.rb +48 -93
- data/lib/active_record/associations/join_dependency/join_association.rb +39 -63
- data/lib/active_record/associations/join_dependency/join_base.rb +9 -8
- data/lib/active_record/associations/join_dependency/join_part.rb +9 -9
- data/lib/active_record/associations/preloader.rb +18 -38
- data/lib/active_record/associations/preloader/association.rb +45 -61
- data/lib/active_record/associations/preloader/through_association.rb +71 -79
- data/lib/active_record/associations/singular_association.rb +14 -16
- data/lib/active_record/associations/through_association.rb +26 -11
- data/lib/active_record/attribute_assignment.rb +2 -5
- data/lib/active_record/attribute_decorators.rb +3 -2
- data/lib/active_record/attribute_methods.rb +65 -24
- data/lib/active_record/attribute_methods/before_type_cast.rb +2 -0
- data/lib/active_record/attribute_methods/dirty.rb +30 -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 +9 -3
- 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 +6 -5
- data/lib/active_record/autosave_association.rb +35 -19
- data/lib/active_record/base.rb +2 -0
- data/lib/active_record/callbacks.rb +8 -6
- 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 +12 -8
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +139 -41
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +7 -0
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +174 -33
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +15 -5
- data/lib/active_record/connection_adapters/abstract/quoting.rb +13 -31
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +14 -5
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +64 -6
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +31 -53
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +152 -81
- data/lib/active_record/connection_adapters/abstract/transaction.rb +66 -21
- data/lib/active_record/connection_adapters/abstract_adapter.rb +84 -97
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +92 -165
- 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 +13 -2
- data/lib/active_record/connection_adapters/mysql/column.rb +2 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +47 -2
- 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 -10
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +30 -30
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +106 -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 +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +2 -0
- 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.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +2 -0
- 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 +4 -2
- 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 +18 -0
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +19 -25
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +50 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +24 -11
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +20 -13
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +233 -111
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +57 -73
- data/lib/active_record/connection_adapters/schema_cache.rb +4 -2
- 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 +22 -0
- 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 +75 -1
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +81 -94
- 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 +41 -61
- data/lib/active_record/counter_cache.rb +10 -3
- data/lib/active_record/define_callbacks.rb +5 -3
- data/lib/active_record/dynamic_matchers.rb +9 -9
- data/lib/active_record/enum.rb +18 -13
- data/lib/active_record/errors.rb +42 -3
- 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 +67 -60
- data/lib/active_record/gem_version.rb +5 -3
- data/lib/active_record/inheritance.rb +49 -19
- 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 +14 -17
- data/lib/active_record/locking/pessimistic.rb +9 -6
- data/lib/active_record/log_subscriber.rb +43 -0
- data/lib/active_record/migration.rb +189 -139
- data/lib/active_record/migration/command_recorder.rb +11 -9
- data/lib/active_record/migration/compatibility.rb +47 -9
- data/lib/active_record/migration/join_table.rb +2 -0
- data/lib/active_record/model_schema.rb +16 -21
- 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 +167 -16
- data/lib/active_record/query_cache.rb +6 -8
- data/lib/active_record/querying.rb +4 -2
- data/lib/active_record/railtie.rb +62 -6
- 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 +46 -36
- data/lib/active_record/readonly_attributes.rb +3 -2
- data/lib/active_record/reflection.rb +108 -194
- data/lib/active_record/relation.rb +120 -214
- 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 +45 -19
- data/lib/active_record/relation/delegation.rb +45 -27
- data/lib/active_record/relation/finder_methods.rb +75 -76
- data/lib/active_record/relation/from_clause.rb +2 -8
- data/lib/active_record/relation/merger.rb +53 -23
- data/lib/active_record/relation/predicate_builder.rb +60 -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 +56 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +26 -9
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
- data/lib/active_record/relation/query_attribute.rb +28 -2
- data/lib/active_record/relation/query_methods.rb +128 -99
- data/lib/active_record/relation/record_fetch_warning.rb +2 -0
- data/lib/active_record/relation/spawn_methods.rb +4 -2
- data/lib/active_record/relation/where_clause.rb +65 -68
- data/lib/active_record/relation/where_clause_factory.rb +5 -48
- data/lib/active_record/result.rb +2 -0
- data/lib/active_record/runtime_registry.rb +2 -0
- data/lib/active_record/sanitization.rb +129 -121
- data/lib/active_record/schema.rb +4 -2
- data/lib/active_record/schema_dumper.rb +36 -26
- data/lib/active_record/schema_migration.rb +2 -0
- data/lib/active_record/scoping.rb +9 -8
- data/lib/active_record/scoping/default.rb +8 -9
- data/lib/active_record/scoping/named.rb +23 -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 +23 -13
- data/lib/active_record/store.rb +3 -1
- data/lib/active_record/suppressor.rb +2 -0
- data/lib/active_record/table_metadata.rb +12 -3
- data/lib/active_record/tasks/database_tasks.rb +25 -14
- 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 +6 -6
- data/lib/active_record/touch_later.rb +2 -0
- data/lib/active_record/transactions.rb +33 -28
- 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 -0
- 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 +3 -1
- 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 +35 -5
- 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 +23 -36
- 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
data/lib/active_record/schema.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
# = Active Record \Schema
|
3
5
|
#
|
@@ -37,7 +39,7 @@ module ActiveRecord
|
|
37
39
|
# The +info+ hash is optional, and if given is used to define metadata
|
38
40
|
# about the current schema (currently, only the schema's version):
|
39
41
|
#
|
40
|
-
# ActiveRecord::Schema.define(version:
|
42
|
+
# ActiveRecord::Schema.define(version: 2038_01_19_000001) do
|
41
43
|
# ...
|
42
44
|
# end
|
43
45
|
def self.define(info = {}, &block)
|
@@ -53,7 +55,7 @@ module ActiveRecord
|
|
53
55
|
end
|
54
56
|
|
55
57
|
ActiveRecord::InternalMetadata.create_table
|
56
|
-
ActiveRecord::InternalMetadata[:environment] =
|
58
|
+
ActiveRecord::InternalMetadata[:environment] = connection.migration_context.current_environment
|
57
59
|
end
|
58
60
|
|
59
61
|
private
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "stringio"
|
2
4
|
|
3
5
|
module ActiveRecord
|
@@ -11,14 +13,13 @@ module ActiveRecord
|
|
11
13
|
##
|
12
14
|
# :singleton-method:
|
13
15
|
# A list of tables which should not be dumped to the schema.
|
14
|
-
# Acceptable values are strings as well as regexp.
|
15
|
-
#
|
16
|
-
cattr_accessor :ignore_tables
|
17
|
-
@@ignore_tables = []
|
16
|
+
# Acceptable values are strings as well as regexp if ActiveRecord::Base.schema_format == :ruby.
|
17
|
+
# Only strings are accepted if ActiveRecord::Base.schema_format == :sql.
|
18
|
+
cattr_accessor :ignore_tables, default: []
|
18
19
|
|
19
20
|
class << self
|
20
21
|
def dump(connection = ActiveRecord::Base.connection, stream = STDOUT, config = ActiveRecord::Base)
|
21
|
-
|
22
|
+
connection.create_schema_dumper(generate_options(config)).dump(stream)
|
22
23
|
stream
|
23
24
|
end
|
24
25
|
|
@@ -43,13 +44,22 @@ module ActiveRecord
|
|
43
44
|
|
44
45
|
def initialize(connection, options = {})
|
45
46
|
@connection = connection
|
46
|
-
@version =
|
47
|
+
@version = connection.migration_context.current_version rescue nil
|
47
48
|
@options = options
|
48
49
|
end
|
49
50
|
|
50
|
-
|
51
|
-
|
51
|
+
# turns 20170404131909 into "2017_04_04_131909"
|
52
|
+
def formatted_version
|
53
|
+
stringified = @version.to_s
|
54
|
+
return stringified unless stringified.length == 14
|
55
|
+
stringified.insert(4, "_").insert(7, "_").insert(10, "_")
|
56
|
+
end
|
52
57
|
|
58
|
+
def define_params
|
59
|
+
@version ? "version: #{formatted_version}" : ""
|
60
|
+
end
|
61
|
+
|
62
|
+
def header(stream)
|
53
63
|
stream.puts <<HEADER
|
54
64
|
# This file is auto-generated from the current state of the database. Instead
|
55
65
|
# of editing this file, please use the migrations feature of Active Record to
|
@@ -72,16 +82,8 @@ HEADER
|
|
72
82
|
stream.puts "end"
|
73
83
|
end
|
74
84
|
|
85
|
+
# extensions are only supported by PostgreSQL
|
75
86
|
def extensions(stream)
|
76
|
-
return unless @connection.supports_extensions?
|
77
|
-
extensions = @connection.extensions
|
78
|
-
if extensions.any?
|
79
|
-
stream.puts " # These are extensions that must be enabled in order to support this database"
|
80
|
-
extensions.each do |extension|
|
81
|
-
stream.puts " enable_extension #{extension.inspect}"
|
82
|
-
end
|
83
|
-
stream.puts
|
84
|
-
end
|
85
87
|
end
|
86
88
|
|
87
89
|
def tables(stream)
|
@@ -113,7 +115,7 @@ HEADER
|
|
113
115
|
when String
|
114
116
|
tbl.print ", primary_key: #{pk.inspect}" unless pk == "id"
|
115
117
|
pkcol = columns.detect { |c| c.name == pk }
|
116
|
-
pkcolspec =
|
118
|
+
pkcolspec = column_spec_for_primary_key(pkcol)
|
117
119
|
if pkcolspec.present?
|
118
120
|
tbl.print ", #{format_colspec(pkcolspec)}"
|
119
121
|
end
|
@@ -122,20 +124,19 @@ HEADER
|
|
122
124
|
else
|
123
125
|
tbl.print ", id: false"
|
124
126
|
end
|
125
|
-
tbl.print ", force: :cascade"
|
126
127
|
|
127
128
|
table_options = @connection.table_options(table)
|
128
129
|
if table_options.present?
|
129
130
|
tbl.print ", #{format_options(table_options)}"
|
130
131
|
end
|
131
132
|
|
132
|
-
tbl.puts " do |t|"
|
133
|
+
tbl.puts ", force: :cascade do |t|"
|
133
134
|
|
134
135
|
# then dump all non-primary key columns
|
135
136
|
columns.each do |column|
|
136
137
|
raise StandardError, "Unknown type '#{column.sql_type}' for column '#{column.name}'" unless @connection.valid_type?(column.type)
|
137
138
|
next if column.name == pk
|
138
|
-
type, colspec =
|
139
|
+
type, colspec = column_spec(column)
|
139
140
|
tbl.print " t.#{type} #{column.name.inspect}"
|
140
141
|
tbl.print ", #{format_colspec(colspec)}" if colspec.present?
|
141
142
|
tbl.puts
|
@@ -153,8 +154,6 @@ HEADER
|
|
153
154
|
stream.puts "# #{e.message}"
|
154
155
|
stream.puts
|
155
156
|
end
|
156
|
-
|
157
|
-
stream
|
158
157
|
end
|
159
158
|
|
160
159
|
# Keep it for indexing materialized views
|
@@ -185,8 +184,9 @@ HEADER
|
|
185
184
|
"name: #{index.name.inspect}",
|
186
185
|
]
|
187
186
|
index_parts << "unique: true" if index.unique
|
188
|
-
index_parts << "length:
|
189
|
-
index_parts << "order:
|
187
|
+
index_parts << "length: #{format_index_parts(index.lengths)}" if index.lengths.present?
|
188
|
+
index_parts << "order: #{format_index_parts(index.orders)}" if index.orders.present?
|
189
|
+
index_parts << "opclass: #{format_index_parts(index.opclasses)}" if index.opclasses.present?
|
190
190
|
index_parts << "where: #{index.where.inspect}" if index.where
|
191
191
|
index_parts << "using: #{index.using.inspect}" if !@connection.default_index_type?(index)
|
192
192
|
index_parts << "type: #{index.type.inspect}" if index.type
|
@@ -232,8 +232,18 @@ HEADER
|
|
232
232
|
options.map { |key, value| "#{key}: #{value.inspect}" }.join(", ")
|
233
233
|
end
|
234
234
|
|
235
|
+
def format_index_parts(options)
|
236
|
+
if options.is_a?(Hash)
|
237
|
+
"{ #{format_options(options)} }"
|
238
|
+
else
|
239
|
+
options.inspect
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
235
243
|
def remove_prefix_and_suffix(table)
|
236
|
-
|
244
|
+
prefix = Regexp.escape(@options[:table_name_prefix].to_s)
|
245
|
+
suffix = Regexp.escape(@options[:table_name_suffix].to_s)
|
246
|
+
table.sub(/\A#{prefix}(.+)#{suffix}\z/, "\\1")
|
237
247
|
end
|
238
248
|
|
239
249
|
def ignored?(table_name)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/per_thread_registry"
|
2
4
|
|
3
5
|
module ActiveRecord
|
@@ -9,23 +11,23 @@ module ActiveRecord
|
|
9
11
|
include Named
|
10
12
|
end
|
11
13
|
|
12
|
-
module ClassMethods
|
13
|
-
def current_scope(skip_inherited_scope = false)
|
14
|
+
module ClassMethods # :nodoc:
|
15
|
+
def current_scope(skip_inherited_scope = false)
|
14
16
|
ScopeRegistry.value_for(:current_scope, self, skip_inherited_scope)
|
15
17
|
end
|
16
18
|
|
17
|
-
def current_scope=(scope)
|
19
|
+
def current_scope=(scope)
|
18
20
|
ScopeRegistry.set_value_for(:current_scope, self, scope)
|
19
21
|
end
|
20
22
|
|
21
23
|
# Collects attributes from scopes that should be applied when creating
|
22
24
|
# an AR instance for the particular class this is called on.
|
23
|
-
def scope_attributes
|
25
|
+
def scope_attributes
|
24
26
|
all.scope_for_create
|
25
27
|
end
|
26
28
|
|
27
29
|
# Are there attributes associated with this scope?
|
28
|
-
def scope_attributes?
|
30
|
+
def scope_attributes?
|
29
31
|
current_scope
|
30
32
|
end
|
31
33
|
end
|
@@ -33,9 +35,8 @@ module ActiveRecord
|
|
33
35
|
def populate_with_current_scope_attributes # :nodoc:
|
34
36
|
return unless self.class.scope_attributes?
|
35
37
|
|
36
|
-
self.class.scope_attributes
|
37
|
-
|
38
|
-
end
|
38
|
+
attributes = self.class.scope_attributes
|
39
|
+
_assign_attributes(attributes) if attributes.any?
|
39
40
|
end
|
40
41
|
|
41
42
|
def initialize_internals_callback # :nodoc:
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module Scoping
|
3
5
|
module Default
|
@@ -5,11 +7,8 @@ module ActiveRecord
|
|
5
7
|
|
6
8
|
included do
|
7
9
|
# Stores the default scope for the class.
|
8
|
-
class_attribute :default_scopes, instance_writer: false, instance_predicate: false
|
9
|
-
class_attribute :default_scope_override, instance_writer: false, instance_predicate: false
|
10
|
-
|
11
|
-
self.default_scopes = []
|
12
|
-
self.default_scope_override = nil
|
10
|
+
class_attribute :default_scopes, instance_writer: false, instance_predicate: false, default: []
|
11
|
+
class_attribute :default_scope_override, instance_writer: false, instance_predicate: false, default: nil
|
13
12
|
end
|
14
13
|
|
15
14
|
module ClassMethods
|
@@ -87,8 +86,8 @@ module ActiveRecord
|
|
87
86
|
# # Should return a scope, you can call 'super' here etc.
|
88
87
|
# end
|
89
88
|
# end
|
90
|
-
def default_scope(scope = nil) # :doc:
|
91
|
-
scope =
|
89
|
+
def default_scope(scope = nil, &block) # :doc:
|
90
|
+
scope = block if block_given?
|
92
91
|
|
93
92
|
if scope.is_a?(Relation) || !scope.respond_to?(:call)
|
94
93
|
raise ArgumentError,
|
@@ -112,7 +111,7 @@ module ActiveRecord
|
|
112
111
|
# The user has defined their own default scope method, so call that
|
113
112
|
evaluate_default_scope do
|
114
113
|
if scope = default_scope
|
115
|
-
(base_rel ||= relation).merge(scope)
|
114
|
+
(base_rel ||= relation).merge!(scope)
|
116
115
|
end
|
117
116
|
end
|
118
117
|
elsif default_scopes.any?
|
@@ -120,7 +119,7 @@ module ActiveRecord
|
|
120
119
|
evaluate_default_scope do
|
121
120
|
default_scopes.inject(base_rel) do |default_scope, scope|
|
122
121
|
scope = scope.respond_to?(:to_proc) ? scope : scope.method(:call)
|
123
|
-
default_scope.merge(base_rel.instance_exec(&scope))
|
122
|
+
default_scope.merge!(base_rel.instance_exec(&scope))
|
124
123
|
end
|
125
124
|
end
|
126
125
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/core_ext/array"
|
2
4
|
require "active_support/core_ext/hash/except"
|
3
5
|
require "active_support/core_ext/kernel/singleton_class"
|
@@ -22,8 +24,14 @@ module ActiveRecord
|
|
22
24
|
# You can define a scope that applies to all finders using
|
23
25
|
# {default_scope}[rdoc-ref:Scoping::Default::ClassMethods#default_scope].
|
24
26
|
def all
|
27
|
+
current_scope = self.current_scope
|
28
|
+
|
25
29
|
if current_scope
|
26
|
-
current_scope.
|
30
|
+
if self == current_scope.klass
|
31
|
+
current_scope.clone
|
32
|
+
else
|
33
|
+
relation.merge!(current_scope)
|
34
|
+
end
|
27
35
|
else
|
28
36
|
default_scoped
|
29
37
|
end
|
@@ -163,24 +171,32 @@ module ActiveRecord
|
|
163
171
|
"a class method with the same name."
|
164
172
|
end
|
165
173
|
|
174
|
+
if method_defined_within?(name, Relation)
|
175
|
+
raise ArgumentError, "You tried to define a scope named \"#{name}\" " \
|
176
|
+
"on the model \"#{self.name}\", but ActiveRecord::Relation already defined " \
|
177
|
+
"an instance method with the same name."
|
178
|
+
end
|
179
|
+
|
166
180
|
valid_scope_name?(name)
|
167
181
|
extension = Module.new(&block) if block
|
168
182
|
|
169
183
|
if body.respond_to?(:to_proc)
|
170
184
|
singleton_class.send(:define_method, name) do |*args|
|
171
|
-
scope = all
|
185
|
+
scope = all
|
186
|
+
scope = scope._exec_scope(*args, &body)
|
172
187
|
scope = scope.extending(extension) if extension
|
173
|
-
|
174
|
-
scope || all
|
188
|
+
scope
|
175
189
|
end
|
176
190
|
else
|
177
191
|
singleton_class.send(:define_method, name) do |*args|
|
178
|
-
scope = all
|
192
|
+
scope = all
|
193
|
+
scope = scope.scoping { body.call(*args) || scope }
|
179
194
|
scope = scope.extending(extension) if extension
|
180
|
-
|
181
|
-
scope || all
|
195
|
+
scope
|
182
196
|
end
|
183
197
|
end
|
198
|
+
|
199
|
+
generate_relation_method(name)
|
184
200
|
end
|
185
201
|
|
186
202
|
private
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
# Statement cache is used to cache a single statement in order to avoid creating the AST again.
|
3
5
|
# Initializing the cache is done by passing the statement in the create block:
|
@@ -9,7 +11,7 @@ module ActiveRecord
|
|
9
11
|
# The cached statement is executed by using the
|
10
12
|
# {connection.execute}[rdoc-ref:ConnectionAdapters::DatabaseStatements#execute] method:
|
11
13
|
#
|
12
|
-
# cache.execute([], Book
|
14
|
+
# cache.execute([], Book.connection)
|
13
15
|
#
|
14
16
|
# The relation returned by the block is cached, and for each
|
15
17
|
# {execute}[rdoc-ref:ConnectionAdapters::DatabaseStatements#execute]
|
@@ -24,7 +26,7 @@ module ActiveRecord
|
|
24
26
|
#
|
25
27
|
# And pass the bind values as the first argument of +execute+ call.
|
26
28
|
#
|
27
|
-
# cache.execute(["my book"], Book
|
29
|
+
# cache.execute(["my book"], Book.connection)
|
28
30
|
class StatementCache # :nodoc:
|
29
31
|
class Substitute; end # :nodoc:
|
30
32
|
|
@@ -85,27 +87,35 @@ module ActiveRecord
|
|
85
87
|
end
|
86
88
|
end
|
87
89
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
bind_map
|
93
|
-
query_builder = connection.cacheable_query(self, relation.arel)
|
94
|
-
new query_builder, bind_map
|
90
|
+
def self.create(connection, callable = nil, &block)
|
91
|
+
relation = (callable || block).call Params.new
|
92
|
+
query_builder, binds = connection.cacheable_query(self, relation.arel)
|
93
|
+
bind_map = BindMap.new(binds)
|
94
|
+
new(query_builder, bind_map, relation.klass)
|
95
95
|
end
|
96
96
|
|
97
|
-
def initialize(query_builder, bind_map)
|
97
|
+
def initialize(query_builder, bind_map, klass)
|
98
98
|
@query_builder = query_builder
|
99
|
-
@bind_map
|
99
|
+
@bind_map = bind_map
|
100
|
+
@klass = klass
|
100
101
|
end
|
101
102
|
|
102
|
-
def execute(params,
|
103
|
+
def execute(params, connection, &block)
|
103
104
|
bind_values = bind_map.bind params
|
104
105
|
|
105
106
|
sql = query_builder.sql_for bind_values, connection
|
106
107
|
|
107
108
|
klass.find_by_sql(sql, bind_values, preparable: true, &block)
|
108
109
|
end
|
109
|
-
|
110
|
+
|
111
|
+
def self.unsupported_value?(value)
|
112
|
+
case value
|
113
|
+
when NilClass, Array, Range, Hash, Relation, Base then true
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
protected
|
118
|
+
|
119
|
+
attr_reader :query_builder, :bind_map, :klass
|
110
120
|
end
|
111
121
|
end
|
data/lib/active_record/store.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/core_ext/hash/indifferent_access"
|
2
4
|
|
3
5
|
module ActiveRecord
|
@@ -133,7 +135,7 @@ module ActiveRecord
|
|
133
135
|
end
|
134
136
|
|
135
137
|
def store_accessor_for(store_attribute)
|
136
|
-
type_for_attribute(store_attribute
|
138
|
+
type_for_attribute(store_attribute).accessor
|
137
139
|
end
|
138
140
|
|
139
141
|
class HashAccessor # :nodoc:
|
@@ -1,7 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
class TableMetadata # :nodoc:
|
3
|
-
delegate :foreign_type, :foreign_key, to: :association, prefix: true
|
4
|
-
delegate :association_primary_key, to: :association
|
5
|
+
delegate :foreign_type, :foreign_key, :join_primary_key, :join_foreign_key, to: :association, prefix: true
|
5
6
|
|
6
7
|
def initialize(klass, arel_table, association = nil)
|
7
8
|
@klass = klass
|
@@ -29,7 +30,7 @@ module ActiveRecord
|
|
29
30
|
|
30
31
|
def type(column_name)
|
31
32
|
if klass
|
32
|
-
klass.type_for_attribute(column_name
|
33
|
+
klass.type_for_attribute(column_name)
|
33
34
|
else
|
34
35
|
Type.default_value
|
35
36
|
end
|
@@ -64,6 +65,14 @@ module ActiveRecord
|
|
64
65
|
association && association.polymorphic?
|
65
66
|
end
|
66
67
|
|
68
|
+
def aggregated_with?(aggregation_name)
|
69
|
+
klass && reflect_on_aggregation(aggregation_name)
|
70
|
+
end
|
71
|
+
|
72
|
+
def reflect_on_aggregation(aggregation_name)
|
73
|
+
klass.reflect_on_aggregation(aggregation_name)
|
74
|
+
end
|
75
|
+
|
67
76
|
# TODO Change this to private once we've dropped Ruby 2.2 support.
|
68
77
|
# Workaround for Ruby 2.2 "private attribute?" warning.
|
69
78
|
protected
|