activerecord 4.2.11.3 → 5.0.7.2
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 +1638 -1132
- 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 +7 -2
- data/lib/active_record/aggregations.rb +34 -21
- data/lib/active_record/association_relation.rb +7 -4
- data/lib/active_record/associations.rb +347 -218
- data/lib/active_record/associations/alias_tracker.rb +19 -16
- data/lib/active_record/associations/association.rb +22 -10
- data/lib/active_record/associations/association_scope.rb +75 -104
- 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 +16 -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 +13 -11
- data/lib/active_record/associations/collection_association.rb +85 -69
- data/lib/active_record/associations/collection_proxy.rb +104 -46
- data/lib/active_record/associations/foreign_association.rb +1 -1
- data/lib/active_record/associations/has_many_association.rb +21 -78
- data/lib/active_record/associations/has_many_through_association.rb +6 -47
- data/lib/active_record/associations/has_one_association.rb +12 -5
- data/lib/active_record/associations/join_dependency.rb +38 -22
- data/lib/active_record/associations/join_dependency/join_association.rb +15 -14
- data/lib/active_record/associations/join_dependency/join_part.rb +2 -2
- data/lib/active_record/associations/preloader.rb +14 -4
- data/lib/active_record/associations/preloader/association.rb +52 -71
- data/lib/active_record/associations/preloader/collection_association.rb +0 -7
- 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/singular_association.rb +0 -1
- data/lib/active_record/associations/preloader/through_association.rb +36 -17
- data/lib/active_record/associations/singular_association.rb +13 -1
- data/lib/active_record/associations/through_association.rb +12 -4
- data/lib/active_record/attribute.rb +69 -19
- 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 +69 -44
- 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 +16 -3
- 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 +32 -3
- data/lib/active_record/attribute_set/builder.rb +42 -16
- data/lib/active_record/attributes.rb +199 -81
- data/lib/active_record/autosave_association.rb +54 -17
- 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 +50 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +467 -189
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +66 -62
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +39 -4
- data/lib/active_record/connection_adapters/abstract/quoting.rb +86 -13
- 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 -188
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +72 -17
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +407 -156
- data/lib/active_record/connection_adapters/abstract/transaction.rb +51 -34
- data/lib/active_record/connection_adapters/abstract_adapter.rb +177 -71
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +433 -399
- 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 +108 -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 +25 -166
- data/lib/active_record/connection_adapters/postgresql/column.rb +33 -11
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +18 -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 +37 -57
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +3 -3
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -2
- 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 +13 -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 +56 -19
- 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 +250 -154
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +35 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +264 -170
- 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 +151 -194
- 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 +92 -108
- data/lib/active_record/counter_cache.rb +13 -24
- data/lib/active_record/dynamic_matchers.rb +1 -20
- data/lib/active_record/enum.rb +116 -76
- data/lib/active_record/errors.rb +87 -48
- data/lib/active_record/explain.rb +20 -9
- 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 +77 -41
- data/lib/active_record/gem_version.rb +4 -4
- data/lib/active_record/inheritance.rb +32 -40
- data/lib/active_record/integration.rb +17 -14
- 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 +48 -24
- data/lib/active_record/migration.rb +362 -111
- 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 +270 -73
- data/lib/active_record/nested_attributes.rb +58 -29
- data/lib/active_record/no_touching.rb +4 -0
- data/lib/active_record/null_relation.rb +16 -8
- data/lib/active_record/persistence.rb +152 -90
- data/lib/active_record/query_cache.rb +18 -23
- data/lib/active_record/querying.rb +12 -11
- 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 +52 -41
- data/lib/active_record/readonly_attributes.rb +1 -1
- data/lib/active_record/reflection.rb +302 -115
- data/lib/active_record/relation.rb +187 -120
- data/lib/active_record/relation/batches.rb +141 -36
- data/lib/active_record/relation/batches/batch_enumerator.rb +67 -0
- data/lib/active_record/relation/calculations.rb +92 -117
- data/lib/active_record/relation/delegation.rb +8 -20
- data/lib/active_record/relation/finder_methods.rb +173 -89
- 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 +11 -4
- data/lib/active_record/runtime_registry.rb +1 -1
- data/lib/active_record/sanitization.rb +105 -66
- data/lib/active_record/schema.rb +26 -22
- data/lib/active_record/schema_dumper.rb +54 -37
- data/lib/active_record/schema_migration.rb +11 -14
- data/lib/active_record/scoping.rb +34 -16
- data/lib/active_record/scoping/default.rb +28 -10
- data/lib/active_record/scoping/named.rb +59 -26
- data/lib/active_record/secure_token.rb +38 -0
- data/lib/active_record/serialization.rb +3 -5
- data/lib/active_record/statement_cache.rb +17 -15
- data/lib/active_record/store.rb +8 -3
- data/lib/active_record/suppressor.rb +58 -0
- data/lib/active_record/table_metadata.rb +69 -0
- data/lib/active_record/tasks/database_tasks.rb +66 -49
- data/lib/active_record/tasks/mysql_database_tasks.rb +6 -14
- data/lib/active_record/tasks/postgresql_database_tasks.rb +12 -3
- 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 +63 -0
- data/lib/active_record/transactions.rb +139 -57
- 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 +33 -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 +33 -33
- data/lib/rails/generators/active_record/migration.rb +15 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +8 -5
- 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 +33 -16
- 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 +58 -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
@@ -5,7 +5,7 @@ module ActiveRecord
|
|
5
5
|
# Enable the query cache within the block if Active Record is configured.
|
6
6
|
# If it's not, it will execute the given block.
|
7
7
|
def cache(&block)
|
8
|
-
if
|
8
|
+
if connected? || !configurations.empty?
|
9
9
|
connection.cache(&block)
|
10
10
|
else
|
11
11
|
yield
|
@@ -15,7 +15,7 @@ module ActiveRecord
|
|
15
15
|
# Disable the query cache within the block if Active Record is configured.
|
16
16
|
# If it's not, it will execute the given block.
|
17
17
|
def uncached(&block)
|
18
|
-
if
|
18
|
+
if connected? || !configurations.empty?
|
19
19
|
connection.uncached(&block)
|
20
20
|
else
|
21
21
|
yield
|
@@ -23,34 +23,29 @@ module ActiveRecord
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
27
|
-
@app = app
|
28
|
-
end
|
29
|
-
|
30
|
-
def call(env)
|
31
|
-
connection = ActiveRecord::Base.connection
|
32
|
-
enabled = connection.query_cache_enabled
|
26
|
+
def self.run
|
33
27
|
connection_id = ActiveRecord::Base.connection_id
|
34
|
-
connection.enable_query_cache!
|
35
28
|
|
36
|
-
|
37
|
-
|
38
|
-
restore_query_cache_settings(connection_id, enabled)
|
39
|
-
end
|
29
|
+
caching_pool = ActiveRecord::Base.connection_pool
|
30
|
+
caching_was_enabled = caching_pool.query_cache_enabled
|
40
31
|
|
41
|
-
|
42
|
-
rescue Exception => e
|
43
|
-
restore_query_cache_settings(connection_id, enabled)
|
44
|
-
raise e
|
45
|
-
end
|
32
|
+
caching_pool.enable_query_cache!
|
46
33
|
|
47
|
-
|
34
|
+
[caching_pool, caching_was_enabled, connection_id]
|
35
|
+
end
|
48
36
|
|
49
|
-
def
|
37
|
+
def self.complete((caching_pool, caching_was_enabled, connection_id))
|
50
38
|
ActiveRecord::Base.connection_id = connection_id
|
51
|
-
|
52
|
-
|
39
|
+
|
40
|
+
caching_pool.disable_query_cache! unless caching_was_enabled
|
41
|
+
|
42
|
+
ActiveRecord::Base.connection_handler.connection_pool_list.each do |pool|
|
43
|
+
pool.release_connection if pool.active_connection? && !pool.connection.transaction_open?
|
44
|
+
end
|
53
45
|
end
|
54
46
|
|
47
|
+
def self.install_executor_hooks(executor = ActiveSupport::Executor)
|
48
|
+
executor.register_hook(self)
|
49
|
+
end
|
55
50
|
end
|
56
51
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
module ActiveRecord
|
2
2
|
module Querying
|
3
|
-
delegate :find, :take, :take!, :first, :first!, :last, :last!, :exists?, :any?, :many?, to: :all
|
4
|
-
delegate :second, :second!, :third, :third!, :fourth, :fourth!, :fifth, :fifth!, :forty_two, :forty_two!, to: :all
|
3
|
+
delegate :find, :take, :take!, :first, :first!, :last, :last!, :exists?, :any?, :many?, :none?, :one?, to: :all
|
4
|
+
delegate :second, :second!, :third, :third!, :fourth, :fourth!, :fifth, :fifth!, :forty_two, :forty_two!, :third_to_last, :third_to_last!, :second_to_last, :second_to_last!, to: :all
|
5
5
|
delegate :first_or_create, :first_or_create!, :first_or_initialize, to: :all
|
6
6
|
delegate :find_or_create_by, :find_or_create_by!, :find_or_initialize_by, to: :all
|
7
7
|
delegate :find_by, :find_by!, to: :all
|
8
8
|
delegate :destroy, :destroy_all, :delete, :delete_all, :update, :update_all, to: :all
|
9
|
-
delegate :find_each, :find_in_batches, to: :all
|
10
|
-
delegate :select, :group, :order, :except, :reorder, :limit, :offset, :joins,
|
9
|
+
delegate :find_each, :find_in_batches, :in_batches, to: :all
|
10
|
+
delegate :select, :group, :order, :except, :reorder, :limit, :offset, :joins, :left_joins, :left_outer_joins, :or,
|
11
11
|
:where, :rewhere, :preload, :eager_load, :includes, :from, :lock, :readonly,
|
12
12
|
:having, :create_with, :uniq, :distinct, :references, :none, :unscope, to: :all
|
13
13
|
delegate :count, :average, :minimum, :maximum, :sum, :calculate, to: :all
|
@@ -35,8 +35,8 @@ module ActiveRecord
|
|
35
35
|
#
|
36
36
|
# Post.find_by_sql ["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date]
|
37
37
|
# Post.find_by_sql ["SELECT body FROM comments WHERE author = :user_id OR approved_by = :user_id", { :user_id => user_id }]
|
38
|
-
def find_by_sql(sql, binds = [])
|
39
|
-
result_set = connection.select_all(sanitize_sql(sql), "#{name} Load", binds)
|
38
|
+
def find_by_sql(sql, binds = [], preparable: nil, &block)
|
39
|
+
result_set = connection.select_all(sanitize_sql(sql), "#{name} Load", binds, preparable: preparable)
|
40
40
|
column_types = result_set.column_types.dup
|
41
41
|
columns_hash.each_key { |k| column_types.delete k }
|
42
42
|
message_bus = ActiveSupport::Notifications.instrumenter
|
@@ -46,8 +46,8 @@ module ActiveRecord
|
|
46
46
|
class_name: name
|
47
47
|
}
|
48
48
|
|
49
|
-
message_bus.instrument(
|
50
|
-
result_set.map { |record| instantiate(record, column_types) }
|
49
|
+
message_bus.instrument("instantiation.active_record", payload) do
|
50
|
+
result_set.map { |record| instantiate(record, column_types, &block) }
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
@@ -55,11 +55,12 @@ module ActiveRecord
|
|
55
55
|
# The use of this method should be restricted to complicated SQL queries that can't be executed
|
56
56
|
# using the ActiveRecord::Calculations class methods. Look into those before using this.
|
57
57
|
#
|
58
|
-
#
|
58
|
+
# Product.count_by_sql "SELECT COUNT(*) FROM sales s, customers c WHERE s.customer_id = c.id"
|
59
|
+
# # => 12
|
59
60
|
#
|
60
|
-
#
|
61
|
+
# ==== Parameters
|
61
62
|
#
|
62
|
-
#
|
63
|
+
# * +sql+ - An SQL statement which should return a count query from the database, see the example above.
|
63
64
|
def count_by_sql(sql)
|
64
65
|
sql = sanitize_conditions(sql)
|
65
66
|
connection.select_value(sql, "#{name} Count").to_i
|
@@ -16,12 +16,6 @@ module ActiveRecord
|
|
16
16
|
config.app_generators.orm :active_record, :migration => true,
|
17
17
|
:timestamps => true
|
18
18
|
|
19
|
-
config.app_middleware.insert_after "::ActionDispatch::Callbacks",
|
20
|
-
"ActiveRecord::QueryCache"
|
21
|
-
|
22
|
-
config.app_middleware.insert_after "::ActionDispatch::Callbacks",
|
23
|
-
"ActiveRecord::ConnectionAdapters::ConnectionManagement"
|
24
|
-
|
25
19
|
config.action_dispatch.rescue_responses.merge!(
|
26
20
|
'ActiveRecord::RecordNotFound' => :not_found,
|
27
21
|
'ActiveRecord::StaleObjectError' => :conflict,
|
@@ -40,7 +34,7 @@ module ActiveRecord
|
|
40
34
|
task :load_config do
|
41
35
|
ActiveRecord::Tasks::DatabaseTasks.database_configuration = Rails.application.config.database_configuration
|
42
36
|
|
43
|
-
if defined?(
|
37
|
+
if defined?(ENGINE_ROOT) && engine = Rails::Engine.find(ENGINE_ROOT)
|
44
38
|
if engine.paths['db/migrate'].existent
|
45
39
|
ActiveRecord::Tasks::DatabaseTasks.migrations_paths += engine.paths['db/migrate'].to_a
|
46
40
|
end
|
@@ -80,8 +74,8 @@ module ActiveRecord
|
|
80
74
|
|
81
75
|
initializer "active_record.migration_error" do
|
82
76
|
if config.active_record.delete(:migration_error) == :page_load
|
83
|
-
config.app_middleware.insert_after
|
84
|
-
|
77
|
+
config.app_middleware.insert_after ::ActionDispatch::Callbacks,
|
78
|
+
ActiveRecord::Migration::CheckPending
|
85
79
|
end
|
86
80
|
end
|
87
81
|
|
@@ -95,6 +89,7 @@ module ActiveRecord
|
|
95
89
|
cache = Marshal.load File.binread filename
|
96
90
|
if cache.version == ActiveRecord::Migrator.current_version
|
97
91
|
self.connection.schema_cache = cache
|
92
|
+
self.connection_pool.schema_cache = cache.dup
|
98
93
|
else
|
99
94
|
warn "Ignoring db/schema_cache.dump because it has expired. The current schema version is #{ActiveRecord::Migrator.current_version}, but the one in the cache is #{cache.version}."
|
100
95
|
end
|
@@ -104,6 +99,14 @@ module ActiveRecord
|
|
104
99
|
end
|
105
100
|
end
|
106
101
|
|
102
|
+
initializer "active_record.warn_on_records_fetched_greater_than" do
|
103
|
+
if config.active_record.warn_on_records_fetched_greater_than
|
104
|
+
ActiveSupport.on_load(:active_record) do
|
105
|
+
require 'active_record/relation/record_fetch_warning'
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
107
110
|
initializer "active_record.set_configs" do |app|
|
108
111
|
ActiveSupport.on_load(:active_record) do
|
109
112
|
app.config.active_record.each do |k,v|
|
@@ -114,7 +117,7 @@ module ActiveRecord
|
|
114
117
|
|
115
118
|
# This sets the database configuration from Configuration#database_configuration
|
116
119
|
# and then establishes the connection.
|
117
|
-
initializer "active_record.initialize_database" do
|
120
|
+
initializer "active_record.initialize_database" do
|
118
121
|
ActiveSupport.on_load(:active_record) do
|
119
122
|
self.configurations = Rails.application.config.database_configuration
|
120
123
|
|
@@ -127,8 +130,8 @@ Oops - You have a database configured, but it doesn't exist yet!
|
|
127
130
|
Here's how to get started:
|
128
131
|
|
129
132
|
1. Configure your database in config/database.yml.
|
130
|
-
2. Run `bin/
|
131
|
-
3. Run `bin/
|
133
|
+
2. Run `bin/rails db:create` to create the database.
|
134
|
+
3. Run `bin/rails db:setup` to load your database schema.
|
132
135
|
end_warning
|
133
136
|
raise
|
134
137
|
end
|
@@ -143,11 +146,9 @@ end_warning
|
|
143
146
|
end
|
144
147
|
end
|
145
148
|
|
146
|
-
initializer "active_record.set_reloader_hooks" do
|
147
|
-
hook = app.config.reload_classes_only_on_change ? :to_prepare : :to_cleanup
|
148
|
-
|
149
|
+
initializer "active_record.set_reloader_hooks" do
|
149
150
|
ActiveSupport.on_load(:active_record) do
|
150
|
-
|
151
|
+
ActiveSupport::Reloader.before_class_unload do
|
151
152
|
if ActiveRecord::Base.connected?
|
152
153
|
ActiveRecord::Base.clear_cache!
|
153
154
|
ActiveRecord::Base.clear_reloadable_connections!
|
@@ -156,6 +157,12 @@ end_warning
|
|
156
157
|
end
|
157
158
|
end
|
158
159
|
|
160
|
+
initializer "active_record.set_executor_hooks" do
|
161
|
+
ActiveSupport.on_load(:active_record) do
|
162
|
+
ActiveRecord::QueryCache.install_executor_hooks
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
159
166
|
initializer "active_record.add_watchable_files" do |app|
|
160
167
|
path = app.paths["db"].first
|
161
168
|
config.watchable_files.concat ["#{path}/schema.rb", "#{path}/structure.sql"]
|
@@ -19,7 +19,7 @@ module ActiveRecord
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def cleanup_view_runtime
|
22
|
-
if ActiveRecord::Base.connected?
|
22
|
+
if logger && logger.info? && ActiveRecord::Base.connected?
|
23
23
|
db_rt_before_render = ActiveRecord::LogSubscriber.reset_runtime
|
24
24
|
self.db_runtime = (db_runtime || 0) + db_rt_before_render
|
25
25
|
runtime = super
|
@@ -1,6 +1,16 @@
|
|
1
1
|
require 'active_record'
|
2
2
|
|
3
3
|
db_namespace = namespace :db do
|
4
|
+
desc "Set the environment value for the database"
|
5
|
+
task "environment:set" => [:environment, :load_config] do
|
6
|
+
ActiveRecord::InternalMetadata.create_table
|
7
|
+
ActiveRecord::InternalMetadata[:environment] = ActiveRecord::Migrator.current_environment
|
8
|
+
end
|
9
|
+
|
10
|
+
task :check_protected_environments => [:environment, :load_config] do
|
11
|
+
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
|
12
|
+
end
|
13
|
+
|
4
14
|
task :load_config do
|
5
15
|
ActiveRecord::Base.configurations = ActiveRecord::Tasks::DatabaseTasks.database_configuration || {}
|
6
16
|
ActiveRecord::Migrator.migrations_paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
|
@@ -12,30 +22,34 @@ db_namespace = namespace :db do
|
|
12
22
|
end
|
13
23
|
end
|
14
24
|
|
15
|
-
desc 'Creates the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all to create all databases in the config). Without RAILS_ENV it defaults to creating the development and test databases.'
|
25
|
+
desc 'Creates the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all to create all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to creating the development and test databases.'
|
16
26
|
task :create => [:load_config] do
|
17
27
|
ActiveRecord::Tasks::DatabaseTasks.create_current
|
18
28
|
end
|
19
29
|
|
20
30
|
namespace :drop do
|
21
|
-
task :all => :load_config do
|
31
|
+
task :all => [:load_config, :check_protected_environments] do
|
22
32
|
ActiveRecord::Tasks::DatabaseTasks.drop_all
|
23
33
|
end
|
24
34
|
end
|
25
35
|
|
26
|
-
desc 'Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to dropping the development and test databases.'
|
27
|
-
task :drop => [:load_config] do
|
36
|
+
desc 'Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to dropping the development and test databases.'
|
37
|
+
task :drop => [:load_config, :check_protected_environments] do
|
38
|
+
db_namespace["drop:_unsafe"].invoke
|
39
|
+
end
|
40
|
+
|
41
|
+
task "drop:_unsafe" => [:load_config] do
|
28
42
|
ActiveRecord::Tasks::DatabaseTasks.drop_current
|
29
43
|
end
|
30
44
|
|
31
45
|
namespace :purge do
|
32
|
-
task :all => :load_config do
|
46
|
+
task :all => [:load_config, :check_protected_environments] do
|
33
47
|
ActiveRecord::Tasks::DatabaseTasks.purge_all
|
34
48
|
end
|
35
49
|
end
|
36
50
|
|
37
|
-
# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:
|
38
|
-
task :purge => [:load_config] do
|
51
|
+
# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:purge:all to purge all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
|
52
|
+
task :purge => [:load_config, :check_protected_environments] do
|
39
53
|
ActiveRecord::Tasks::DatabaseTasks.purge_current
|
40
54
|
end
|
41
55
|
|
@@ -79,18 +93,18 @@ db_namespace = namespace :db do
|
|
79
93
|
|
80
94
|
# desc 'Runs the "up" for a given migration VERSION.'
|
81
95
|
task :up => [:environment, :load_config] do
|
82
|
-
raise "VERSION is required" if ENV["VERSION"]
|
96
|
+
raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
|
83
97
|
|
84
98
|
version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
|
85
|
-
ActiveRecord::Migrator.run(:up, ActiveRecord::
|
99
|
+
ActiveRecord::Migrator.run(:up, ActiveRecord::Tasks::DatabaseTasks.migrations_paths, version)
|
86
100
|
db_namespace['_dump'].invoke
|
87
101
|
end
|
88
102
|
|
89
103
|
# desc 'Runs the "down" for a given migration VERSION.'
|
90
104
|
task :down => [:environment, :load_config] do
|
91
|
-
raise "VERSION is required - To go down one migration, use db:rollback" if ENV["VERSION"]
|
105
|
+
raise "VERSION is required - To go down one migration, use db:rollback" if !ENV["VERSION"] || ENV["VERSION"].empty?
|
92
106
|
version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
|
93
|
-
ActiveRecord::Migrator.run(:down, ActiveRecord::
|
107
|
+
ActiveRecord::Migrator.run(:down, ActiveRecord::Tasks::DatabaseTasks.migrations_paths, version)
|
94
108
|
db_namespace['_dump'].invoke
|
95
109
|
end
|
96
110
|
|
@@ -115,22 +129,19 @@ db_namespace = namespace :db do
|
|
115
129
|
desc 'Rolls the schema back to the previous version (specify steps w/ STEP=n).'
|
116
130
|
task :rollback => [:environment, :load_config] do
|
117
131
|
step = ENV['STEP'] ? ENV['STEP'].to_i : 1
|
118
|
-
ActiveRecord::Migrator.rollback(ActiveRecord::
|
132
|
+
ActiveRecord::Migrator.rollback(ActiveRecord::Tasks::DatabaseTasks.migrations_paths, step)
|
119
133
|
db_namespace['_dump'].invoke
|
120
134
|
end
|
121
135
|
|
122
136
|
# desc 'Pushes the schema to the next version (specify steps w/ STEP=n).'
|
123
137
|
task :forward => [:environment, :load_config] do
|
124
138
|
step = ENV['STEP'] ? ENV['STEP'].to_i : 1
|
125
|
-
ActiveRecord::Migrator.forward(ActiveRecord::
|
139
|
+
ActiveRecord::Migrator.forward(ActiveRecord::Tasks::DatabaseTasks.migrations_paths, step)
|
126
140
|
db_namespace['_dump'].invoke
|
127
141
|
end
|
128
142
|
|
129
143
|
# desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
|
130
|
-
task :reset => [:
|
131
|
-
db_namespace["drop"].invoke
|
132
|
-
db_namespace["setup"].invoke
|
133
|
-
end
|
144
|
+
task :reset => [ 'db:drop', 'db:setup' ]
|
134
145
|
|
135
146
|
# desc "Retrieves the charset for the current environment's database"
|
136
147
|
task :charset => [:environment, :load_config] do
|
@@ -152,29 +163,29 @@ db_namespace = namespace :db do
|
|
152
163
|
end
|
153
164
|
|
154
165
|
# desc "Raises an error if there are pending migrations"
|
155
|
-
task :abort_if_pending_migrations => :environment do
|
156
|
-
pending_migrations = ActiveRecord::Migrator.open(ActiveRecord::
|
166
|
+
task :abort_if_pending_migrations => [:environment, :load_config] do
|
167
|
+
pending_migrations = ActiveRecord::Migrator.open(ActiveRecord::Tasks::DatabaseTasks.migrations_paths).pending_migrations
|
157
168
|
|
158
169
|
if pending_migrations.any?
|
159
170
|
puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
|
160
171
|
pending_migrations.each do |pending_migration|
|
161
172
|
puts ' %4d %s' % [pending_migration.version, pending_migration.name]
|
162
173
|
end
|
163
|
-
abort %{Run `
|
174
|
+
abort %{Run `rails db:migrate` to update your database then try again.}
|
164
175
|
end
|
165
176
|
end
|
166
177
|
|
167
|
-
desc '
|
178
|
+
desc 'Creates the database, loads the schema, and initializes with the seed data (use db:reset to also drop the database first)'
|
168
179
|
task :setup => ['db:schema:load_if_ruby', 'db:structure:load_if_sql', :seed]
|
169
180
|
|
170
|
-
desc '
|
181
|
+
desc 'Loads the seed data from db/seeds.rb'
|
171
182
|
task :seed do
|
172
183
|
db_namespace['abort_if_pending_migrations'].invoke
|
173
184
|
ActiveRecord::Tasks::DatabaseTasks.load_seed
|
174
185
|
end
|
175
186
|
|
176
187
|
namespace :fixtures do
|
177
|
-
desc "
|
188
|
+
desc "Loads fixtures into the current environment's database. Load specific fixtures using FIXTURES=x,y. Load from subdirectory in test/fixtures using FIXTURES_DIR=z. Specify an alternative path (eg. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
|
178
189
|
task :load => [:environment, :load_config] do
|
179
190
|
require 'active_record/fixtures'
|
180
191
|
|
@@ -222,7 +233,7 @@ db_namespace = namespace :db do
|
|
222
233
|
end
|
223
234
|
|
224
235
|
namespace :schema do
|
225
|
-
desc '
|
236
|
+
desc 'Creates a db/schema.rb file that is portable against any DB supported by Active Record'
|
226
237
|
task :dump => [:environment, :load_config] do
|
227
238
|
require 'active_record/schema_dumper'
|
228
239
|
filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
|
@@ -232,8 +243,8 @@ db_namespace = namespace :db do
|
|
232
243
|
db_namespace['schema:dump'].reenable
|
233
244
|
end
|
234
245
|
|
235
|
-
desc '
|
236
|
-
task :load => [:environment, :load_config] do
|
246
|
+
desc 'Loads a schema.rb file into the database'
|
247
|
+
task :load => [:environment, :load_config, :check_protected_environments] do
|
237
248
|
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
|
238
249
|
end
|
239
250
|
|
@@ -242,29 +253,29 @@ db_namespace = namespace :db do
|
|
242
253
|
end
|
243
254
|
|
244
255
|
namespace :cache do
|
245
|
-
desc '
|
256
|
+
desc 'Creates a db/schema_cache.dump file.'
|
246
257
|
task :dump => [:environment, :load_config] do
|
247
258
|
con = ActiveRecord::Base.connection
|
248
259
|
filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.dump")
|
249
260
|
|
250
261
|
con.schema_cache.clear!
|
251
|
-
con.
|
262
|
+
con.data_sources.each { |table| con.schema_cache.add(table) }
|
252
263
|
open(filename, 'wb') { |f| f.write(Marshal.dump(con.schema_cache)) }
|
253
264
|
end
|
254
265
|
|
255
|
-
desc '
|
266
|
+
desc 'Clears a db/schema_cache.dump file.'
|
256
267
|
task :clear => [:environment, :load_config] do
|
257
268
|
filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.dump")
|
258
|
-
|
269
|
+
rm_f filename, verbose: false
|
259
270
|
end
|
260
271
|
end
|
261
272
|
|
262
273
|
end
|
263
274
|
|
264
275
|
namespace :structure do
|
265
|
-
desc '
|
276
|
+
desc 'Dumps the database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql'
|
266
277
|
task :dump => [:environment, :load_config] do
|
267
|
-
filename = ENV['
|
278
|
+
filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "structure.sql")
|
268
279
|
current_config = ActiveRecord::Tasks::DatabaseTasks.current_config
|
269
280
|
ActiveRecord::Tasks::DatabaseTasks.structure_dump(current_config, filename)
|
270
281
|
|
@@ -278,9 +289,9 @@ db_namespace = namespace :db do
|
|
278
289
|
db_namespace['structure:dump'].reenable
|
279
290
|
end
|
280
291
|
|
281
|
-
desc "
|
282
|
-
task :load => [:load_config] do
|
283
|
-
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:sql, ENV['
|
292
|
+
desc "Recreates the databases from the structure.sql file"
|
293
|
+
task :load => [:environment, :load_config, :check_protected_environments] do
|
294
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:sql, ENV['SCHEMA'])
|
284
295
|
end
|
285
296
|
|
286
297
|
task :load_if_sql => ['db:create', :environment] do
|
@@ -312,7 +323,7 @@ db_namespace = namespace :db do
|
|
312
323
|
begin
|
313
324
|
should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
|
314
325
|
ActiveRecord::Schema.verbose = false
|
315
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
326
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema ActiveRecord::Base.configurations["test"], :ruby, ENV["SCHEMA"], "test"
|
316
327
|
ensure
|
317
328
|
if should_reconnect
|
318
329
|
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[ActiveRecord::Tasks::DatabaseTasks.env])
|
@@ -322,7 +333,7 @@ db_namespace = namespace :db do
|
|
322
333
|
|
323
334
|
# desc "Recreate the test database from an existent structure.sql file"
|
324
335
|
task :load_structure => %w(db:test:purge) do
|
325
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
336
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema ActiveRecord::Base.configurations["test"], :sql, ENV["SCHEMA"], "test"
|
326
337
|
end
|
327
338
|
|
328
339
|
# desc "Recreate the test database from a fresh schema"
|
@@ -342,11 +353,11 @@ db_namespace = namespace :db do
|
|
342
353
|
task :clone_structure => %w(db:test:deprecated db:structure:dump db:test:load_structure)
|
343
354
|
|
344
355
|
# desc "Empty the test database"
|
345
|
-
task :purge => %w(environment load_config) do
|
356
|
+
task :purge => %w(environment load_config check_protected_environments) do
|
346
357
|
ActiveRecord::Tasks::DatabaseTasks.purge ActiveRecord::Base.configurations['test']
|
347
358
|
end
|
348
359
|
|
349
|
-
# desc '
|
360
|
+
# desc 'Load the test schema'
|
350
361
|
task :prepare => %w(environment load_config) do
|
351
362
|
unless ActiveRecord::Base.configurations.blank?
|
352
363
|
db_namespace['test:load'].invoke
|
@@ -359,7 +370,7 @@ namespace :railties do
|
|
359
370
|
namespace :install do
|
360
371
|
# desc "Copies missing migrations from Railties (e.g. engines). You can specify Railties to use with FROM=railtie1,railtie2"
|
361
372
|
task :migrations => :'db:load_config' do
|
362
|
-
to_load = ENV['FROM'].blank? ? :all : ENV['FROM'].split(",").map
|
373
|
+
to_load = ENV['FROM'].blank? ? :all : ENV['FROM'].split(",").map(&:strip)
|
363
374
|
railties = {}
|
364
375
|
Rails.application.migration_railties.each do |railtie|
|
365
376
|
next unless to_load == :all || to_load.include?(railtie.railtie_name)
|
@@ -377,7 +388,7 @@ namespace :railties do
|
|
377
388
|
puts "Copied migration #{migration.basename} from #{name}"
|
378
389
|
end
|
379
390
|
|
380
|
-
ActiveRecord::Migration.copy(ActiveRecord::
|
391
|
+
ActiveRecord::Migration.copy(ActiveRecord::Tasks::DatabaseTasks.migrations_paths.first, railties,
|
381
392
|
:on_skip => on_skip, :on_copy => on_copy)
|
382
393
|
end
|
383
394
|
end
|