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.

Files changed (241) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +299 -739
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +1 -1
  5. data/examples/performance.rb +1 -1
  6. data/lib/active_record.rb +2 -1
  7. data/lib/active_record/aggregations.rb +4 -2
  8. data/lib/active_record/associations.rb +16 -12
  9. data/lib/active_record/associations/association.rb +35 -19
  10. data/lib/active_record/associations/association_scope.rb +4 -6
  11. data/lib/active_record/associations/belongs_to_association.rb +36 -42
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +0 -4
  13. data/lib/active_record/associations/builder/belongs_to.rb +14 -50
  14. data/lib/active_record/associations/builder/collection_association.rb +3 -3
  15. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -38
  16. data/lib/active_record/associations/collection_association.rb +11 -25
  17. data/lib/active_record/associations/collection_proxy.rb +32 -6
  18. data/lib/active_record/associations/foreign_association.rb +7 -0
  19. data/lib/active_record/associations/has_many_association.rb +1 -1
  20. data/lib/active_record/associations/has_many_through_association.rb +25 -18
  21. data/lib/active_record/associations/has_one_association.rb +28 -30
  22. data/lib/active_record/associations/has_one_through_association.rb +5 -5
  23. data/lib/active_record/associations/join_dependency.rb +15 -20
  24. data/lib/active_record/associations/join_dependency/join_association.rb +11 -26
  25. data/lib/active_record/associations/join_dependency/join_part.rb +2 -2
  26. data/lib/active_record/associations/preloader.rb +32 -29
  27. data/lib/active_record/associations/preloader/association.rb +1 -2
  28. data/lib/active_record/associations/singular_association.rb +2 -16
  29. data/lib/active_record/attribute_assignment.rb +7 -10
  30. data/lib/active_record/attribute_methods.rb +34 -56
  31. data/lib/active_record/attribute_methods/dirty.rb +64 -26
  32. data/lib/active_record/attribute_methods/primary_key.rb +8 -7
  33. data/lib/active_record/attribute_methods/read.rb +16 -48
  34. data/lib/active_record/attribute_methods/serialization.rb +1 -1
  35. data/lib/active_record/attribute_methods/time_zone_conversion.rb +1 -1
  36. data/lib/active_record/attribute_methods/write.rb +15 -16
  37. data/lib/active_record/autosave_association.rb +7 -21
  38. data/lib/active_record/base.rb +2 -2
  39. data/lib/active_record/callbacks.rb +3 -17
  40. data/lib/active_record/collection_cache_key.rb +1 -1
  41. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +13 -36
  42. data/lib/active_record/connection_adapters/abstract/database_limits.rb +9 -0
  43. data/lib/active_record/connection_adapters/abstract/database_statements.rb +25 -84
  44. data/lib/active_record/connection_adapters/abstract/query_cache.rb +17 -14
  45. data/lib/active_record/connection_adapters/abstract/quoting.rb +5 -11
  46. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +15 -11
  47. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +30 -13
  48. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +0 -2
  49. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +41 -27
  50. data/lib/active_record/connection_adapters/abstract/transaction.rb +81 -52
  51. data/lib/active_record/connection_adapters/abstract_adapter.rb +95 -31
  52. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +65 -90
  53. data/lib/active_record/connection_adapters/connection_specification.rb +52 -42
  54. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +5 -9
  55. data/lib/active_record/connection_adapters/mysql/database_statements.rb +29 -7
  56. data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
  57. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +3 -4
  58. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +65 -10
  59. data/lib/active_record/connection_adapters/mysql2_adapter.rb +8 -4
  60. data/lib/active_record/connection_adapters/postgresql/column.rb +1 -2
  61. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +16 -1
  62. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
  63. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
  64. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +1 -1
  65. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +1 -1
  66. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
  67. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +1 -1
  68. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +9 -7
  69. data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
  70. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +11 -36
  71. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +9 -2
  72. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +38 -20
  73. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +2 -1
  74. data/lib/active_record/connection_adapters/postgresql_adapter.rb +75 -56
  75. data/lib/active_record/connection_adapters/schema_cache.rb +5 -0
  76. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +5 -5
  77. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +14 -9
  78. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +95 -62
  79. data/lib/active_record/connection_handling.rb +132 -26
  80. data/lib/active_record/core.rb +76 -43
  81. data/lib/active_record/counter_cache.rb +4 -29
  82. data/lib/active_record/database_configurations.rb +184 -0
  83. data/lib/active_record/database_configurations/database_config.rb +37 -0
  84. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  85. data/lib/active_record/database_configurations/url_config.rb +74 -0
  86. data/lib/active_record/enum.rb +22 -7
  87. data/lib/active_record/errors.rb +24 -21
  88. data/lib/active_record/explain.rb +1 -1
  89. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  90. data/lib/active_record/fixture_set/render_context.rb +17 -0
  91. data/lib/active_record/fixture_set/table_row.rb +153 -0
  92. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  93. data/lib/active_record/fixtures.rb +140 -472
  94. data/lib/active_record/gem_version.rb +4 -4
  95. data/lib/active_record/inheritance.rb +12 -2
  96. data/lib/active_record/integration.rb +56 -16
  97. data/lib/active_record/internal_metadata.rb +5 -1
  98. data/lib/active_record/locking/optimistic.rb +2 -2
  99. data/lib/active_record/locking/pessimistic.rb +3 -3
  100. data/lib/active_record/log_subscriber.rb +7 -26
  101. data/lib/active_record/migration.rb +38 -37
  102. data/lib/active_record/migration/command_recorder.rb +35 -5
  103. data/lib/active_record/migration/compatibility.rb +34 -16
  104. data/lib/active_record/model_schema.rb +30 -9
  105. data/lib/active_record/nested_attributes.rb +2 -2
  106. data/lib/active_record/no_touching.rb +7 -0
  107. data/lib/active_record/persistence.rb +18 -7
  108. data/lib/active_record/query_cache.rb +11 -4
  109. data/lib/active_record/querying.rb +19 -11
  110. data/lib/active_record/railtie.rb +71 -42
  111. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  112. data/lib/active_record/railties/controller_runtime.rb +30 -35
  113. data/lib/active_record/railties/databases.rake +94 -43
  114. data/lib/active_record/reflection.rb +60 -44
  115. data/lib/active_record/relation.rb +150 -69
  116. data/lib/active_record/relation/batches.rb +13 -10
  117. data/lib/active_record/relation/calculations.rb +38 -28
  118. data/lib/active_record/relation/delegation.rb +4 -13
  119. data/lib/active_record/relation/finder_methods.rb +12 -25
  120. data/lib/active_record/relation/merger.rb +2 -6
  121. data/lib/active_record/relation/predicate_builder.rb +4 -6
  122. data/lib/active_record/relation/predicate_builder/array_handler.rb +5 -4
  123. data/lib/active_record/relation/predicate_builder/association_query_value.rb +1 -4
  124. data/lib/active_record/relation/predicate_builder/base_handler.rb +1 -2
  125. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
  126. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +1 -4
  127. data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
  128. data/lib/active_record/relation/query_attribute.rb +15 -12
  129. data/lib/active_record/relation/query_methods.rb +29 -52
  130. data/lib/active_record/relation/where_clause.rb +4 -0
  131. data/lib/active_record/relation/where_clause_factory.rb +1 -2
  132. data/lib/active_record/result.rb +30 -11
  133. data/lib/active_record/sanitization.rb +2 -39
  134. data/lib/active_record/schema.rb +1 -10
  135. data/lib/active_record/schema_dumper.rb +12 -6
  136. data/lib/active_record/schema_migration.rb +4 -0
  137. data/lib/active_record/scoping.rb +9 -8
  138. data/lib/active_record/scoping/default.rb +10 -3
  139. data/lib/active_record/scoping/named.rb +10 -14
  140. data/lib/active_record/statement_cache.rb +32 -5
  141. data/lib/active_record/store.rb +39 -8
  142. data/lib/active_record/table_metadata.rb +1 -4
  143. data/lib/active_record/tasks/database_tasks.rb +89 -23
  144. data/lib/active_record/tasks/mysql_database_tasks.rb +2 -4
  145. data/lib/active_record/tasks/postgresql_database_tasks.rb +5 -7
  146. data/lib/active_record/tasks/sqlite_database_tasks.rb +2 -8
  147. data/lib/active_record/test_databases.rb +38 -0
  148. data/lib/active_record/test_fixtures.rb +224 -0
  149. data/lib/active_record/timestamp.rb +4 -6
  150. data/lib/active_record/transactions.rb +3 -22
  151. data/lib/active_record/translation.rb +1 -1
  152. data/lib/active_record/type.rb +3 -4
  153. data/lib/active_record/type/adapter_specific_registry.rb +1 -8
  154. data/lib/active_record/type_caster/connection.rb +1 -6
  155. data/lib/active_record/type_caster/map.rb +1 -4
  156. data/lib/active_record/validations/uniqueness.rb +13 -25
  157. data/lib/arel.rb +44 -0
  158. data/lib/arel/alias_predication.rb +9 -0
  159. data/lib/arel/attributes.rb +22 -0
  160. data/lib/arel/attributes/attribute.rb +37 -0
  161. data/lib/arel/collectors/bind.rb +24 -0
  162. data/lib/arel/collectors/composite.rb +31 -0
  163. data/lib/arel/collectors/plain_string.rb +20 -0
  164. data/lib/arel/collectors/sql_string.rb +20 -0
  165. data/lib/arel/collectors/substitute_binds.rb +28 -0
  166. data/lib/arel/crud.rb +42 -0
  167. data/lib/arel/delete_manager.rb +18 -0
  168. data/lib/arel/errors.rb +9 -0
  169. data/lib/arel/expressions.rb +29 -0
  170. data/lib/arel/factory_methods.rb +49 -0
  171. data/lib/arel/insert_manager.rb +49 -0
  172. data/lib/arel/math.rb +45 -0
  173. data/lib/arel/nodes.rb +67 -0
  174. data/lib/arel/nodes/and.rb +32 -0
  175. data/lib/arel/nodes/ascending.rb +23 -0
  176. data/lib/arel/nodes/binary.rb +52 -0
  177. data/lib/arel/nodes/bind_param.rb +36 -0
  178. data/lib/arel/nodes/case.rb +55 -0
  179. data/lib/arel/nodes/casted.rb +50 -0
  180. data/lib/arel/nodes/count.rb +12 -0
  181. data/lib/arel/nodes/delete_statement.rb +45 -0
  182. data/lib/arel/nodes/descending.rb +23 -0
  183. data/lib/arel/nodes/equality.rb +18 -0
  184. data/lib/arel/nodes/extract.rb +24 -0
  185. data/lib/arel/nodes/false.rb +16 -0
  186. data/lib/arel/nodes/full_outer_join.rb +8 -0
  187. data/lib/arel/nodes/function.rb +44 -0
  188. data/lib/arel/nodes/grouping.rb +8 -0
  189. data/lib/arel/nodes/in.rb +8 -0
  190. data/lib/arel/nodes/infix_operation.rb +80 -0
  191. data/lib/arel/nodes/inner_join.rb +8 -0
  192. data/lib/arel/nodes/insert_statement.rb +37 -0
  193. data/lib/arel/nodes/join_source.rb +20 -0
  194. data/lib/arel/nodes/matches.rb +18 -0
  195. data/lib/arel/nodes/named_function.rb +23 -0
  196. data/lib/arel/nodes/node.rb +50 -0
  197. data/lib/arel/nodes/node_expression.rb +13 -0
  198. data/lib/arel/nodes/outer_join.rb +8 -0
  199. data/lib/arel/nodes/over.rb +15 -0
  200. data/lib/arel/nodes/regexp.rb +16 -0
  201. data/lib/arel/nodes/right_outer_join.rb +8 -0
  202. data/lib/arel/nodes/select_core.rb +63 -0
  203. data/lib/arel/nodes/select_statement.rb +41 -0
  204. data/lib/arel/nodes/sql_literal.rb +16 -0
  205. data/lib/arel/nodes/string_join.rb +11 -0
  206. data/lib/arel/nodes/table_alias.rb +27 -0
  207. data/lib/arel/nodes/terminal.rb +16 -0
  208. data/lib/arel/nodes/true.rb +16 -0
  209. data/lib/arel/nodes/unary.rb +44 -0
  210. data/lib/arel/nodes/unary_operation.rb +20 -0
  211. data/lib/arel/nodes/unqualified_column.rb +22 -0
  212. data/lib/arel/nodes/update_statement.rb +41 -0
  213. data/lib/arel/nodes/values.rb +16 -0
  214. data/lib/arel/nodes/values_list.rb +24 -0
  215. data/lib/arel/nodes/window.rb +126 -0
  216. data/lib/arel/nodes/with.rb +11 -0
  217. data/lib/arel/order_predications.rb +13 -0
  218. data/lib/arel/predications.rb +257 -0
  219. data/lib/arel/select_manager.rb +271 -0
  220. data/lib/arel/table.rb +110 -0
  221. data/lib/arel/tree_manager.rb +72 -0
  222. data/lib/arel/update_manager.rb +34 -0
  223. data/lib/arel/visitors.rb +20 -0
  224. data/lib/arel/visitors/depth_first.rb +199 -0
  225. data/lib/arel/visitors/dot.rb +292 -0
  226. data/lib/arel/visitors/ibm_db.rb +21 -0
  227. data/lib/arel/visitors/informix.rb +56 -0
  228. data/lib/arel/visitors/mssql.rb +143 -0
  229. data/lib/arel/visitors/mysql.rb +83 -0
  230. data/lib/arel/visitors/oracle.rb +159 -0
  231. data/lib/arel/visitors/oracle12.rb +67 -0
  232. data/lib/arel/visitors/postgresql.rb +116 -0
  233. data/lib/arel/visitors/sqlite.rb +39 -0
  234. data/lib/arel/visitors/to_sql.rb +913 -0
  235. data/lib/arel/visitors/visitor.rb +42 -0
  236. data/lib/arel/visitors/where_sql.rb +23 -0
  237. data/lib/arel/window_predications.rb +9 -0
  238. data/lib/rails/generators/active_record/migration.rb +14 -1
  239. data/lib/rails/generators/active_record/migration/migration_generator.rb +2 -5
  240. data/lib/rails/generators/active_record/model/model_generator.rb +1 -0
  241. 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.dup
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.check_represent_sqlite3_boolean_as_integer" do
198
- config.after_initialize do
199
- ActiveSupport.on_load(:active_record_sqlite3adapter) do
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
- # TODO Change this to private once we've dropped Ruby 2.2 support.
12
- # Workaround for Ruby 2.2 "private attribute?" warning.
13
- protected
14
-
15
- attr_internal :db_runtime
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
- def cleanup_view_runtime
28
- if logger && logger.info? && ActiveRecord::Base.connected?
29
- db_rt_before_render = ActiveRecord::LogSubscriber.reset_runtime
30
- self.db_runtime = (db_runtime || 0) + db_rt_before_render
31
- runtime = super
32
- db_rt_after_render = ActiveRecord::LogSubscriber.reset_runtime
33
- self.db_runtime += db_rt_after_render
34
- runtime - db_rt_after_render
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
- def append_info_to_payload(payload)
41
- super
42
- if ActiveRecord::Base.connected?
43
- payload[:db_runtime] = (db_runtime || 0) + ActiveRecord::LogSubscriber.reset_runtime
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
- module ClassMethods # :nodoc:
48
- def log_process_action(payload)
49
- messages, db_runtime = super, payload[:db_runtime]
50
- messages << ("ActiveRecord: %.1fms" % db_runtime.to_f) if db_runtime
51
- messages
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::Tasks::DatabaseTasks.migrate
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
- unless ActiveRecord::SchemaMigration.table_exists?
125
- abort "Schema migrations table does not exist yet."
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
- # output
129
- puts "\ndatabase: #{ActiveRecord::Base.connection_config[:database]}\n\n"
130
- puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
131
- puts "-" * 50
132
- ActiveRecord::Base.connection.migration_context.migrations_status.each do |status, version, name|
133
- puts "#{status.center(8)} #{version.ljust(14)} #{name}"
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
- begin
164
- puts ActiveRecord::Tasks::DatabaseTasks.collation_current
165
- rescue NoMethodError
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 :seed do
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
- filename = ENV["SCHEMA"] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema.rb")
250
- File.open(filename, "w:utf-8") do |file|
251
- ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
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
- conn = ActiveRecord::Base.connection
269
- filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.yml")
270
- ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(conn, filename)
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
- filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.yml")
276
- rm_f filename, verbose: false
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
- filename = ENV["SCHEMA"] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "structure.sql")
286
- current_config = ActiveRecord::Tasks::DatabaseTasks.current_config
287
- ActiveRecord::Tasks::DatabaseTasks.structure_dump(current_config, filename)
288
-
289
- if ActiveRecord::SchemaMigration.table_exists?
290
- File.open(filename, "a") do |f|
291
- f.puts ActiveRecord::Base.connection.dump_schema_information
292
- f.print "\n"
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
- begin
322
- should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
323
- ActiveRecord::Schema.verbose = false
324
- ActiveRecord::Tasks::DatabaseTasks.load_schema ActiveRecord::Base.configurations["test"], :ruby, ENV["SCHEMA"], "test"
325
- ensure
326
- if should_reconnect
327
- ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[ActiveRecord::Tasks::DatabaseTasks.env])
328
- end
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::Tasks::DatabaseTasks.load_schema ActiveRecord::Base.configurations["test"], :sql, ENV["SCHEMA"], "test"
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::Tasks::DatabaseTasks.purge ActiveRecord::Base.configurations["test"]
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|