activerecord 5.2.4.5 → 6.0.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 +4 -4
- data/CHANGELOG.md +299 -739
- data/MIT-LICENSE +3 -1
- data/README.rdoc +1 -1
- data/examples/performance.rb +1 -1
- data/lib/active_record.rb +2 -1
- data/lib/active_record/aggregations.rb +4 -2
- data/lib/active_record/associations.rb +16 -12
- data/lib/active_record/associations/association.rb +35 -19
- data/lib/active_record/associations/association_scope.rb +4 -6
- data/lib/active_record/associations/belongs_to_association.rb +36 -42
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +0 -4
- data/lib/active_record/associations/builder/belongs_to.rb +14 -50
- data/lib/active_record/associations/builder/collection_association.rb +3 -3
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -38
- data/lib/active_record/associations/collection_association.rb +11 -25
- data/lib/active_record/associations/collection_proxy.rb +32 -6
- data/lib/active_record/associations/foreign_association.rb +7 -0
- data/lib/active_record/associations/has_many_association.rb +1 -1
- data/lib/active_record/associations/has_many_through_association.rb +25 -18
- data/lib/active_record/associations/has_one_association.rb +28 -30
- data/lib/active_record/associations/has_one_through_association.rb +5 -5
- data/lib/active_record/associations/join_dependency.rb +15 -20
- data/lib/active_record/associations/join_dependency/join_association.rb +11 -26
- data/lib/active_record/associations/join_dependency/join_part.rb +2 -2
- data/lib/active_record/associations/preloader.rb +32 -29
- data/lib/active_record/associations/preloader/association.rb +1 -2
- data/lib/active_record/associations/singular_association.rb +2 -16
- data/lib/active_record/attribute_assignment.rb +7 -10
- data/lib/active_record/attribute_methods.rb +34 -56
- data/lib/active_record/attribute_methods/dirty.rb +64 -26
- data/lib/active_record/attribute_methods/primary_key.rb +8 -7
- data/lib/active_record/attribute_methods/read.rb +16 -48
- data/lib/active_record/attribute_methods/serialization.rb +1 -1
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +1 -1
- data/lib/active_record/attribute_methods/write.rb +15 -16
- data/lib/active_record/autosave_association.rb +7 -21
- data/lib/active_record/base.rb +2 -2
- data/lib/active_record/callbacks.rb +3 -17
- data/lib/active_record/collection_cache_key.rb +1 -1
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +13 -36
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +9 -0
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +25 -84
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +17 -14
- data/lib/active_record/connection_adapters/abstract/quoting.rb +5 -11
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +15 -11
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +30 -13
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +0 -2
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +41 -27
- data/lib/active_record/connection_adapters/abstract/transaction.rb +81 -52
- data/lib/active_record/connection_adapters/abstract_adapter.rb +95 -31
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +65 -90
- data/lib/active_record/connection_adapters/connection_specification.rb +52 -42
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +5 -9
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +29 -7
- data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +3 -4
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +65 -10
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +8 -4
- data/lib/active_record/connection_adapters/postgresql/column.rb +1 -2
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +16 -1
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +9 -7
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +11 -36
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +9 -2
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +38 -20
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +2 -1
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +75 -56
- data/lib/active_record/connection_adapters/schema_cache.rb +5 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +5 -5
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +14 -9
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +95 -62
- data/lib/active_record/connection_handling.rb +132 -26
- data/lib/active_record/core.rb +76 -43
- data/lib/active_record/counter_cache.rb +4 -29
- data/lib/active_record/database_configurations.rb +184 -0
- data/lib/active_record/database_configurations/database_config.rb +37 -0
- data/lib/active_record/database_configurations/hash_config.rb +50 -0
- data/lib/active_record/database_configurations/url_config.rb +74 -0
- data/lib/active_record/enum.rb +22 -7
- data/lib/active_record/errors.rb +24 -21
- data/lib/active_record/explain.rb +1 -1
- data/lib/active_record/fixture_set/model_metadata.rb +33 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +153 -0
- data/lib/active_record/fixture_set/table_rows.rb +47 -0
- data/lib/active_record/fixtures.rb +140 -472
- data/lib/active_record/gem_version.rb +4 -4
- data/lib/active_record/inheritance.rb +12 -2
- data/lib/active_record/integration.rb +56 -16
- data/lib/active_record/internal_metadata.rb +5 -1
- data/lib/active_record/locking/optimistic.rb +2 -2
- data/lib/active_record/locking/pessimistic.rb +3 -3
- data/lib/active_record/log_subscriber.rb +7 -26
- data/lib/active_record/migration.rb +38 -37
- data/lib/active_record/migration/command_recorder.rb +35 -5
- data/lib/active_record/migration/compatibility.rb +34 -16
- data/lib/active_record/model_schema.rb +30 -9
- data/lib/active_record/nested_attributes.rb +2 -2
- data/lib/active_record/no_touching.rb +7 -0
- data/lib/active_record/persistence.rb +18 -7
- data/lib/active_record/query_cache.rb +11 -4
- data/lib/active_record/querying.rb +19 -11
- data/lib/active_record/railtie.rb +71 -42
- data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
- data/lib/active_record/railties/controller_runtime.rb +30 -35
- data/lib/active_record/railties/databases.rake +94 -43
- data/lib/active_record/reflection.rb +60 -44
- data/lib/active_record/relation.rb +150 -69
- data/lib/active_record/relation/batches.rb +13 -10
- data/lib/active_record/relation/calculations.rb +38 -28
- data/lib/active_record/relation/delegation.rb +4 -13
- data/lib/active_record/relation/finder_methods.rb +12 -25
- data/lib/active_record/relation/merger.rb +2 -6
- data/lib/active_record/relation/predicate_builder.rb +4 -6
- data/lib/active_record/relation/predicate_builder/array_handler.rb +5 -4
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +1 -4
- data/lib/active_record/relation/predicate_builder/base_handler.rb +1 -2
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +1 -4
- data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
- data/lib/active_record/relation/query_attribute.rb +15 -12
- data/lib/active_record/relation/query_methods.rb +29 -52
- data/lib/active_record/relation/where_clause.rb +4 -0
- data/lib/active_record/relation/where_clause_factory.rb +1 -2
- data/lib/active_record/result.rb +30 -11
- data/lib/active_record/sanitization.rb +2 -39
- data/lib/active_record/schema.rb +1 -10
- data/lib/active_record/schema_dumper.rb +12 -6
- data/lib/active_record/schema_migration.rb +4 -0
- data/lib/active_record/scoping.rb +9 -8
- data/lib/active_record/scoping/default.rb +10 -3
- data/lib/active_record/scoping/named.rb +10 -14
- data/lib/active_record/statement_cache.rb +32 -5
- data/lib/active_record/store.rb +39 -8
- data/lib/active_record/table_metadata.rb +1 -4
- data/lib/active_record/tasks/database_tasks.rb +89 -23
- data/lib/active_record/tasks/mysql_database_tasks.rb +2 -4
- data/lib/active_record/tasks/postgresql_database_tasks.rb +5 -7
- data/lib/active_record/tasks/sqlite_database_tasks.rb +2 -8
- data/lib/active_record/test_databases.rb +38 -0
- data/lib/active_record/test_fixtures.rb +224 -0
- data/lib/active_record/timestamp.rb +4 -6
- data/lib/active_record/transactions.rb +3 -22
- data/lib/active_record/translation.rb +1 -1
- data/lib/active_record/type.rb +3 -4
- data/lib/active_record/type/adapter_specific_registry.rb +1 -8
- data/lib/active_record/type_caster/connection.rb +1 -6
- data/lib/active_record/type_caster/map.rb +1 -4
- data/lib/active_record/validations/uniqueness.rb +13 -25
- data/lib/arel.rb +44 -0
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes.rb +22 -0
- data/lib/arel/attributes/attribute.rb +37 -0
- data/lib/arel/collectors/bind.rb +24 -0
- data/lib/arel/collectors/composite.rb +31 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +20 -0
- data/lib/arel/collectors/substitute_binds.rb +28 -0
- data/lib/arel/crud.rb +42 -0
- data/lib/arel/delete_manager.rb +18 -0
- data/lib/arel/errors.rb +9 -0
- data/lib/arel/expressions.rb +29 -0
- data/lib/arel/factory_methods.rb +49 -0
- data/lib/arel/insert_manager.rb +49 -0
- data/lib/arel/math.rb +45 -0
- data/lib/arel/nodes.rb +67 -0
- data/lib/arel/nodes/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +52 -0
- data/lib/arel/nodes/bind_param.rb +36 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +50 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/delete_statement.rb +45 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +18 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +44 -0
- data/lib/arel/nodes/grouping.rb +8 -0
- data/lib/arel/nodes/in.rb +8 -0
- data/lib/arel/nodes/infix_operation.rb +80 -0
- data/lib/arel/nodes/inner_join.rb +8 -0
- data/lib/arel/nodes/insert_statement.rb +37 -0
- data/lib/arel/nodes/join_source.rb +20 -0
- data/lib/arel/nodes/matches.rb +18 -0
- data/lib/arel/nodes/named_function.rb +23 -0
- data/lib/arel/nodes/node.rb +50 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/outer_join.rb +8 -0
- data/lib/arel/nodes/over.rb +15 -0
- data/lib/arel/nodes/regexp.rb +16 -0
- data/lib/arel/nodes/right_outer_join.rb +8 -0
- data/lib/arel/nodes/select_core.rb +63 -0
- data/lib/arel/nodes/select_statement.rb +41 -0
- data/lib/arel/nodes/sql_literal.rb +16 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +27 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +44 -0
- data/lib/arel/nodes/unary_operation.rb +20 -0
- data/lib/arel/nodes/unqualified_column.rb +22 -0
- data/lib/arel/nodes/update_statement.rb +41 -0
- data/lib/arel/nodes/values.rb +16 -0
- data/lib/arel/nodes/values_list.rb +24 -0
- data/lib/arel/nodes/window.rb +126 -0
- data/lib/arel/nodes/with.rb +11 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +257 -0
- data/lib/arel/select_manager.rb +271 -0
- data/lib/arel/table.rb +110 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors.rb +20 -0
- data/lib/arel/visitors/depth_first.rb +199 -0
- data/lib/arel/visitors/dot.rb +292 -0
- data/lib/arel/visitors/ibm_db.rb +21 -0
- data/lib/arel/visitors/informix.rb +56 -0
- data/lib/arel/visitors/mssql.rb +143 -0
- data/lib/arel/visitors/mysql.rb +83 -0
- data/lib/arel/visitors/oracle.rb +159 -0
- data/lib/arel/visitors/oracle12.rb +67 -0
- data/lib/arel/visitors/postgresql.rb +116 -0
- data/lib/arel/visitors/sqlite.rb +39 -0
- data/lib/arel/visitors/to_sql.rb +913 -0
- data/lib/arel/visitors/visitor.rb +42 -0
- data/lib/arel/visitors/where_sql.rb +23 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/rails/generators/active_record/migration.rb +14 -1
- data/lib/rails/generators/active_record/migration/migration_generator.rb +2 -5
- data/lib/rails/generators/active_record/model/model_generator.rb +1 -0
- metadata +104 -26
@@ -77,6 +77,10 @@ module ActiveRecord
|
|
77
77
|
ActiveSupport.on_load(:active_record) { self.logger ||= ::Rails.logger }
|
78
78
|
end
|
79
79
|
|
80
|
+
initializer "active_record.backtrace_cleaner" do
|
81
|
+
ActiveSupport.on_load(:active_record) { LogSubscriber.backtrace_cleaner = ::Rails.backtrace_cleaner }
|
82
|
+
end
|
83
|
+
|
80
84
|
initializer "active_record.migration_error" do
|
81
85
|
if config.active_record.delete(:migration_error) == :page_load
|
82
86
|
config.app_middleware.insert_after ::ActionDispatch::Callbacks,
|
@@ -84,6 +88,31 @@ module ActiveRecord
|
|
84
88
|
end
|
85
89
|
end
|
86
90
|
|
91
|
+
initializer "Check for cache versioning support" do
|
92
|
+
config.after_initialize do |app|
|
93
|
+
ActiveSupport.on_load(:active_record) do
|
94
|
+
if app.config.active_record.cache_versioning && Rails.cache
|
95
|
+
unless Rails.cache.class.try(:supports_cache_versioning?)
|
96
|
+
raise <<-end_error
|
97
|
+
|
98
|
+
You're using a cache store that doesn't support native cache versioning.
|
99
|
+
Your best option is to upgrade to a newer version of #{Rails.cache.class}
|
100
|
+
that supports cache versioning (#{Rails.cache.class}.supports_cache_versioning? #=> true).
|
101
|
+
|
102
|
+
Next best, switch to a different cache store that does support cache versioning:
|
103
|
+
https://guides.rubyonrails.org/caching_with_rails.html#cache-stores.
|
104
|
+
|
105
|
+
To keep using the current cache store, you can turn off cache versioning entirely:
|
106
|
+
|
107
|
+
config.active_record.cache_versioning = false
|
108
|
+
|
109
|
+
end_error
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
87
116
|
initializer "active_record.check_schema_cache_dump" do
|
88
117
|
if config.active_record.delete(:use_schema_cache_dump)
|
89
118
|
config.after_initialize do |app|
|
@@ -108,6 +137,26 @@ module ActiveRecord
|
|
108
137
|
end
|
109
138
|
end
|
110
139
|
|
140
|
+
initializer "active_record.define_attribute_methods" do |app|
|
141
|
+
config.after_initialize do
|
142
|
+
ActiveSupport.on_load(:active_record) do
|
143
|
+
if app.config.eager_load
|
144
|
+
descendants.each do |model|
|
145
|
+
# SchemaMigration and InternalMetadata both override `table_exists?`
|
146
|
+
# to bypass the schema cache, so skip them to avoid the extra queries.
|
147
|
+
next if model._internal?
|
148
|
+
|
149
|
+
# If there's no connection yet, or the schema cache doesn't have the columns
|
150
|
+
# hash for the model cached, `define_attribute_methods` would trigger a query.
|
151
|
+
next unless model.connected? && model.connection.schema_cache.columns_hash?(model.table_name)
|
152
|
+
|
153
|
+
model.define_attribute_methods
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
111
160
|
initializer "active_record.warn_on_records_fetched_greater_than" do
|
112
161
|
if config.active_record.warn_on_records_fetched_greater_than
|
113
162
|
ActiveSupport.on_load(:active_record) do
|
@@ -118,8 +167,18 @@ module ActiveRecord
|
|
118
167
|
|
119
168
|
initializer "active_record.set_configs" do |app|
|
120
169
|
ActiveSupport.on_load(:active_record) do
|
121
|
-
configs = app.config.active_record
|
170
|
+
configs = app.config.active_record
|
171
|
+
|
172
|
+
represent_boolean_as_integer = configs.sqlite3.delete(:represent_boolean_as_integer)
|
173
|
+
|
174
|
+
unless represent_boolean_as_integer.nil?
|
175
|
+
ActiveSupport.on_load(:active_record_sqlite3adapter) do
|
176
|
+
ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer = represent_boolean_as_integer
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
122
180
|
configs.delete(:sqlite3)
|
181
|
+
|
123
182
|
configs.each do |k, v|
|
124
183
|
send "#{k}=", v
|
125
184
|
end
|
@@ -131,21 +190,7 @@ module ActiveRecord
|
|
131
190
|
initializer "active_record.initialize_database" do
|
132
191
|
ActiveSupport.on_load(:active_record) do
|
133
192
|
self.configurations = Rails.application.config.database_configuration
|
134
|
-
|
135
|
-
begin
|
136
|
-
establish_connection
|
137
|
-
rescue ActiveRecord::NoDatabaseError
|
138
|
-
warn <<-end_warning
|
139
|
-
Oops - You have a database configured, but it doesn't exist yet!
|
140
|
-
|
141
|
-
Here's how to get started:
|
142
|
-
|
143
|
-
1. Configure your database in config/database.yml.
|
144
|
-
2. Run `bin/rails db:create` to create the database.
|
145
|
-
3. Run `bin/rails db:setup` to load your database schema.
|
146
|
-
end_warning
|
147
|
-
raise
|
148
|
-
end
|
193
|
+
establish_connection
|
149
194
|
end
|
150
195
|
end
|
151
196
|
|
@@ -157,6 +202,13 @@ end_warning
|
|
157
202
|
end
|
158
203
|
end
|
159
204
|
|
205
|
+
initializer "active_record.collection_cache_association_loading" do
|
206
|
+
require "active_record/railties/collection_cache_association_loading"
|
207
|
+
ActiveSupport.on_load(:action_view) do
|
208
|
+
ActionView::PartialRenderer.prepend(ActiveRecord::Railties::CollectionCacheAssociationLoading)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
160
212
|
initializer "active_record.set_reloader_hooks" do
|
161
213
|
ActiveSupport.on_load(:active_record) do
|
162
214
|
ActiveSupport::Reloader.before_class_unload do
|
@@ -194,32 +246,9 @@ end_warning
|
|
194
246
|
end
|
195
247
|
end
|
196
248
|
|
197
|
-
initializer "active_record.
|
198
|
-
|
199
|
-
|
200
|
-
represent_boolean_as_integer = Rails.application.config.active_record.sqlite3.delete(:represent_boolean_as_integer)
|
201
|
-
unless represent_boolean_as_integer.nil?
|
202
|
-
ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer = represent_boolean_as_integer
|
203
|
-
end
|
204
|
-
|
205
|
-
unless ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer
|
206
|
-
ActiveSupport::Deprecation.warn <<-MSG
|
207
|
-
Leaving `ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer`
|
208
|
-
set to false is deprecated. SQLite databases have used 't' and 'f' to serialize
|
209
|
-
boolean values and must have old data converted to 1 and 0 (its native boolean
|
210
|
-
serialization) before setting this flag to true. Conversion can be accomplished
|
211
|
-
by setting up a rake task which runs
|
212
|
-
|
213
|
-
ExampleModel.where("boolean_column = 't'").update_all(boolean_column: 1)
|
214
|
-
ExampleModel.where("boolean_column = 'f'").update_all(boolean_column: 0)
|
215
|
-
|
216
|
-
for all models and all boolean columns, after which the flag must be set to
|
217
|
-
true by adding the following to your application.rb file:
|
218
|
-
|
219
|
-
Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = true
|
220
|
-
MSG
|
221
|
-
end
|
222
|
-
end
|
249
|
+
initializer "active_record.set_filter_attributes" do
|
250
|
+
ActiveSupport.on_load(:active_record) do
|
251
|
+
self.filter_attributes += Rails.application.config.filter_parameters
|
223
252
|
end
|
224
253
|
end
|
225
254
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module Railties # :nodoc:
|
5
|
+
module CollectionCacheAssociationLoading #:nodoc:
|
6
|
+
def setup(context, options, block)
|
7
|
+
@relation = relation_from_options(options)
|
8
|
+
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
12
|
+
def relation_from_options(cached: nil, partial: nil, collection: nil, **_)
|
13
|
+
return unless cached
|
14
|
+
|
15
|
+
relation = partial if partial.is_a?(ActiveRecord::Relation)
|
16
|
+
relation ||= collection if collection.is_a?(ActiveRecord::Relation)
|
17
|
+
|
18
|
+
if relation && !relation.loaded?
|
19
|
+
relation.skip_preloading!
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def collection_without_template
|
24
|
+
@relation.preload_associations(@collection) if @relation
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
def collection_with_template
|
29
|
+
@relation.preload_associations(@collection) if @relation
|
30
|
+
super
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -8,49 +8,44 @@ module ActiveRecord
|
|
8
8
|
module ControllerRuntime #:nodoc:
|
9
9
|
extend ActiveSupport::Concern
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def process_action(action, *args)
|
20
|
-
# We also need to reset the runtime before each action
|
21
|
-
# because of queries in middleware or in cases we are streaming
|
22
|
-
# and it won't be cleaned up by the method below.
|
23
|
-
ActiveRecord::LogSubscriber.reset_runtime
|
24
|
-
super
|
11
|
+
module ClassMethods # :nodoc:
|
12
|
+
def log_process_action(payload)
|
13
|
+
messages, db_runtime = super, payload[:db_runtime]
|
14
|
+
messages << ("ActiveRecord: %.1fms" % db_runtime.to_f) if db_runtime
|
15
|
+
messages
|
16
|
+
end
|
25
17
|
end
|
26
18
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
runtime
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
else
|
19
|
+
private
|
20
|
+
attr_internal :db_runtime
|
21
|
+
|
22
|
+
def process_action(action, *args)
|
23
|
+
# We also need to reset the runtime before each action
|
24
|
+
# because of queries in middleware or in cases we are streaming
|
25
|
+
# and it won't be cleaned up by the method below.
|
26
|
+
ActiveRecord::LogSubscriber.reset_runtime
|
36
27
|
super
|
37
28
|
end
|
38
|
-
end
|
39
29
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
30
|
+
def cleanup_view_runtime
|
31
|
+
if logger && logger.info? && ActiveRecord::Base.connected?
|
32
|
+
db_rt_before_render = ActiveRecord::LogSubscriber.reset_runtime
|
33
|
+
self.db_runtime = (db_runtime || 0) + db_rt_before_render
|
34
|
+
runtime = super
|
35
|
+
db_rt_after_render = ActiveRecord::LogSubscriber.reset_runtime
|
36
|
+
self.db_runtime += db_rt_after_render
|
37
|
+
runtime - db_rt_after_render
|
38
|
+
else
|
39
|
+
super
|
40
|
+
end
|
44
41
|
end
|
45
|
-
end
|
46
42
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
43
|
+
def append_info_to_payload(payload)
|
44
|
+
super
|
45
|
+
if ActiveRecord::Base.connected?
|
46
|
+
payload[:db_runtime] = (db_runtime || 0) + ActiveRecord::LogSubscriber.reset_runtime
|
47
|
+
end
|
52
48
|
end
|
53
|
-
end
|
54
49
|
end
|
55
50
|
end
|
56
51
|
end
|
@@ -22,6 +22,14 @@ db_namespace = namespace :db do
|
|
22
22
|
task all: :load_config do
|
23
23
|
ActiveRecord::Tasks::DatabaseTasks.create_all
|
24
24
|
end
|
25
|
+
|
26
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each do |spec_name|
|
27
|
+
desc "Create #{spec_name} database for current environment"
|
28
|
+
task spec_name => :load_config do
|
29
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
|
30
|
+
ActiveRecord::Tasks::DatabaseTasks.create(db_config.config)
|
31
|
+
end
|
32
|
+
end
|
25
33
|
end
|
26
34
|
|
27
35
|
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."
|
@@ -33,6 +41,14 @@ db_namespace = namespace :db do
|
|
33
41
|
task all: [:load_config, :check_protected_environments] do
|
34
42
|
ActiveRecord::Tasks::DatabaseTasks.drop_all
|
35
43
|
end
|
44
|
+
|
45
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each do |spec_name|
|
46
|
+
desc "Drop #{spec_name} database for current environment"
|
47
|
+
task spec_name => [:load_config, :check_protected_environments] do
|
48
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
|
49
|
+
ActiveRecord::Tasks::DatabaseTasks.drop(db_config.config)
|
50
|
+
end
|
51
|
+
end
|
36
52
|
end
|
37
53
|
|
38
54
|
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."
|
@@ -57,7 +73,10 @@ db_namespace = namespace :db do
|
|
57
73
|
|
58
74
|
desc "Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)."
|
59
75
|
task migrate: :load_config do
|
60
|
-
ActiveRecord::
|
76
|
+
ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).each do |db_config|
|
77
|
+
ActiveRecord::Base.establish_connection(db_config.config)
|
78
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate
|
79
|
+
end
|
61
80
|
db_namespace["_dump"].invoke
|
62
81
|
end
|
63
82
|
|
@@ -77,6 +96,15 @@ db_namespace = namespace :db do
|
|
77
96
|
end
|
78
97
|
|
79
98
|
namespace :migrate do
|
99
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each do |spec_name|
|
100
|
+
desc "Migrate #{spec_name} database for current environment"
|
101
|
+
task spec_name => :load_config do
|
102
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
|
103
|
+
ActiveRecord::Base.establish_connection(db_config.config)
|
104
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
80
108
|
# desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
|
81
109
|
task redo: :load_config do
|
82
110
|
raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
|
@@ -121,18 +149,21 @@ db_namespace = namespace :db do
|
|
121
149
|
|
122
150
|
desc "Display status of migrations"
|
123
151
|
task status: :load_config do
|
124
|
-
|
125
|
-
|
152
|
+
ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).each do |db_config|
|
153
|
+
ActiveRecord::Base.establish_connection(db_config.config)
|
154
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate_status
|
126
155
|
end
|
156
|
+
end
|
127
157
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
158
|
+
namespace :status do
|
159
|
+
ActiveRecord::Tasks::DatabaseTasks.for_each do |spec_name|
|
160
|
+
desc "Display status of migrations for #{spec_name} database"
|
161
|
+
task spec_name => :load_config do
|
162
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
|
163
|
+
ActiveRecord::Base.establish_connection(db_config.config)
|
164
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate_status
|
165
|
+
end
|
134
166
|
end
|
135
|
-
puts
|
136
167
|
end
|
137
168
|
end
|
138
169
|
|
@@ -160,11 +191,9 @@ db_namespace = namespace :db do
|
|
160
191
|
|
161
192
|
# desc "Retrieves the collation for the current environment's database"
|
162
193
|
task collation: :load_config do
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
$stderr.puts "Sorry, your database adapter is not supported yet. Feel free to submit a patch."
|
167
|
-
end
|
194
|
+
puts ActiveRecord::Tasks::DatabaseTasks.collation_current
|
195
|
+
rescue NoMethodError
|
196
|
+
$stderr.puts "Sorry, your database adapter is not supported yet. Feel free to submit a patch."
|
168
197
|
end
|
169
198
|
|
170
199
|
desc "Retrieves the current schema version number"
|
@@ -189,7 +218,7 @@ db_namespace = namespace :db do
|
|
189
218
|
task setup: ["db:schema:load_if_ruby", "db:structure:load_if_sql", :seed]
|
190
219
|
|
191
220
|
desc "Loads the seed data from db/seeds.rb"
|
192
|
-
task :
|
221
|
+
task seed: :load_config do
|
193
222
|
db_namespace["abort_if_pending_migrations"].invoke
|
194
223
|
ActiveRecord::Tasks::DatabaseTasks.load_seed
|
195
224
|
end
|
@@ -246,10 +275,14 @@ db_namespace = namespace :db do
|
|
246
275
|
desc "Creates a db/schema.rb file that is portable against any DB supported by Active Record"
|
247
276
|
task dump: :load_config do
|
248
277
|
require "active_record/schema_dumper"
|
249
|
-
|
250
|
-
|
251
|
-
|
278
|
+
ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).each do |db_config|
|
279
|
+
filename = ActiveRecord::Tasks::DatabaseTasks.dump_filename(db_config.spec_name, :ruby)
|
280
|
+
File.open(filename, "w:utf-8") do |file|
|
281
|
+
ActiveRecord::Base.establish_connection(db_config.config)
|
282
|
+
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
|
283
|
+
end
|
252
284
|
end
|
285
|
+
|
253
286
|
db_namespace["schema:dump"].reenable
|
254
287
|
end
|
255
288
|
|
@@ -265,33 +298,41 @@ db_namespace = namespace :db do
|
|
265
298
|
namespace :cache do
|
266
299
|
desc "Creates a db/schema_cache.yml file."
|
267
300
|
task dump: :load_config do
|
268
|
-
|
269
|
-
|
270
|
-
|
301
|
+
ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).each do |db_config|
|
302
|
+
ActiveRecord::Base.establish_connection(db_config.config)
|
303
|
+
filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(db_config.spec_name)
|
304
|
+
ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(
|
305
|
+
ActiveRecord::Base.connection,
|
306
|
+
filename,
|
307
|
+
)
|
308
|
+
end
|
271
309
|
end
|
272
310
|
|
273
311
|
desc "Clears a db/schema_cache.yml file."
|
274
312
|
task clear: :load_config do
|
275
|
-
|
276
|
-
|
313
|
+
ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).each do |db_config|
|
314
|
+
filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(db_config.spec_name)
|
315
|
+
rm_f filename, verbose: false
|
316
|
+
end
|
277
317
|
end
|
278
318
|
end
|
279
|
-
|
280
319
|
end
|
281
320
|
|
282
321
|
namespace :structure do
|
283
322
|
desc "Dumps the database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql"
|
284
323
|
task dump: :load_config do
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
324
|
+
ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).each do |db_config|
|
325
|
+
ActiveRecord::Base.establish_connection(db_config.config)
|
326
|
+
filename = ActiveRecord::Tasks::DatabaseTasks.dump_filename(db_config.spec_name, :sql)
|
327
|
+
ActiveRecord::Tasks::DatabaseTasks.structure_dump(db_config.config, filename)
|
328
|
+
if ActiveRecord::SchemaMigration.table_exists?
|
329
|
+
File.open(filename, "a") do |f|
|
330
|
+
f.puts ActiveRecord::Base.connection.dump_schema_information
|
331
|
+
f.print "\n"
|
332
|
+
end
|
293
333
|
end
|
294
334
|
end
|
335
|
+
|
295
336
|
db_namespace["structure:dump"].reenable
|
296
337
|
end
|
297
338
|
|
@@ -318,25 +359,31 @@ db_namespace = namespace :db do
|
|
318
359
|
|
319
360
|
# desc "Recreate the test database from an existent schema.rb file"
|
320
361
|
task load_schema: %w(db:test:purge) do
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
362
|
+
should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
|
363
|
+
ActiveRecord::Schema.verbose = false
|
364
|
+
ActiveRecord::Base.configurations.configs_for(env_name: "test").each do |db_config|
|
365
|
+
filename = ActiveRecord::Tasks::DatabaseTasks.dump_filename(db_config.spec_name, :ruby)
|
366
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config.config, :ruby, filename, "test")
|
367
|
+
end
|
368
|
+
ensure
|
369
|
+
if should_reconnect
|
370
|
+
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations.default_hash(ActiveRecord::Tasks::DatabaseTasks.env))
|
329
371
|
end
|
330
372
|
end
|
331
373
|
|
332
374
|
# desc "Recreate the test database from an existent structure.sql file"
|
333
375
|
task load_structure: %w(db:test:purge) do
|
334
|
-
ActiveRecord::
|
376
|
+
ActiveRecord::Base.configurations.configs_for(env_name: "test").each do |db_config|
|
377
|
+
filename = ActiveRecord::Tasks::DatabaseTasks.dump_filename(db_config.spec_name, :sql)
|
378
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config.config, :sql, filename, "test")
|
379
|
+
end
|
335
380
|
end
|
336
381
|
|
337
382
|
# desc "Empty the test database"
|
338
383
|
task purge: %w(load_config check_protected_environments) do
|
339
|
-
ActiveRecord::
|
384
|
+
ActiveRecord::Base.configurations.configs_for(env_name: "test").each do |db_config|
|
385
|
+
ActiveRecord::Tasks::DatabaseTasks.purge(db_config.config)
|
386
|
+
end
|
340
387
|
end
|
341
388
|
|
342
389
|
# desc 'Load the test schema'
|
@@ -360,6 +407,10 @@ namespace :railties do
|
|
360
407
|
if railtie.respond_to?(:paths) && (path = railtie.paths["db/migrate"].first)
|
361
408
|
railties[railtie.railtie_name] = path
|
362
409
|
end
|
410
|
+
|
411
|
+
unless ENV["MIGRATIONS_PATH"].blank?
|
412
|
+
railties[railtie.railtie_name] = railtie.root + ENV["MIGRATIONS_PATH"]
|
413
|
+
end
|
363
414
|
end
|
364
415
|
|
365
416
|
on_skip = Proc.new do |name, migration|
|