activerecord 3.1.10 → 4.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (237) hide show
  1. checksums.yaml +6 -6
  2. data/CHANGELOG.md +1837 -338
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +39 -43
  5. data/examples/performance.rb +51 -20
  6. data/examples/simple.rb +4 -4
  7. data/lib/active_record/aggregations.rb +57 -43
  8. data/lib/active_record/association_relation.rb +35 -0
  9. data/lib/active_record/associations/alias_tracker.rb +47 -39
  10. data/lib/active_record/associations/association.rb +71 -85
  11. data/lib/active_record/associations/association_scope.rb +138 -89
  12. data/lib/active_record/associations/belongs_to_association.rb +65 -25
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +9 -3
  14. data/lib/active_record/associations/builder/association.rb +125 -29
  15. data/lib/active_record/associations/builder/belongs_to.rb +91 -60
  16. data/lib/active_record/associations/builder/collection_association.rb +69 -49
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +113 -42
  18. data/lib/active_record/associations/builder/has_many.rb +8 -64
  19. data/lib/active_record/associations/builder/has_one.rb +12 -52
  20. data/lib/active_record/associations/builder/singular_association.rb +22 -29
  21. data/lib/active_record/associations/collection_association.rb +294 -187
  22. data/lib/active_record/associations/collection_proxy.rb +961 -94
  23. data/lib/active_record/associations/foreign_association.rb +11 -0
  24. data/lib/active_record/associations/has_many_association.rb +118 -23
  25. data/lib/active_record/associations/has_many_through_association.rb +115 -45
  26. data/lib/active_record/associations/has_one_association.rb +57 -24
  27. data/lib/active_record/associations/has_one_through_association.rb +1 -1
  28. data/lib/active_record/associations/join_dependency/join_association.rb +76 -102
  29. data/lib/active_record/associations/join_dependency/join_base.rb +7 -9
  30. data/lib/active_record/associations/join_dependency/join_part.rb +30 -37
  31. data/lib/active_record/associations/join_dependency.rb +230 -156
  32. data/lib/active_record/associations/preloader/association.rb +96 -55
  33. data/lib/active_record/associations/preloader/collection_association.rb +3 -3
  34. data/lib/active_record/associations/preloader/has_many_through.rb +7 -3
  35. data/lib/active_record/associations/preloader/has_one.rb +1 -1
  36. data/lib/active_record/associations/preloader/singular_association.rb +3 -3
  37. data/lib/active_record/associations/preloader/through_association.rb +61 -32
  38. data/lib/active_record/associations/preloader.rb +113 -87
  39. data/lib/active_record/associations/singular_association.rb +29 -13
  40. data/lib/active_record/associations/through_association.rb +37 -19
  41. data/lib/active_record/associations.rb +505 -371
  42. data/lib/active_record/attribute.rb +163 -0
  43. data/lib/active_record/attribute_assignment.rb +212 -0
  44. data/lib/active_record/attribute_decorators.rb +66 -0
  45. data/lib/active_record/attribute_methods/before_type_cast.rb +52 -7
  46. data/lib/active_record/attribute_methods/dirty.rb +141 -51
  47. data/lib/active_record/attribute_methods/primary_key.rb +87 -36
  48. data/lib/active_record/attribute_methods/query.rb +5 -4
  49. data/lib/active_record/attribute_methods/read.rb +74 -117
  50. data/lib/active_record/attribute_methods/serialization.rb +70 -0
  51. data/lib/active_record/attribute_methods/time_zone_conversion.rb +49 -47
  52. data/lib/active_record/attribute_methods/write.rb +60 -21
  53. data/lib/active_record/attribute_methods.rb +409 -48
  54. data/lib/active_record/attribute_set/builder.rb +106 -0
  55. data/lib/active_record/attribute_set.rb +81 -0
  56. data/lib/active_record/attributes.rb +147 -0
  57. data/lib/active_record/autosave_association.rb +279 -232
  58. data/lib/active_record/base.rb +84 -1969
  59. data/lib/active_record/callbacks.rb +66 -28
  60. data/lib/active_record/coders/json.rb +13 -0
  61. data/lib/active_record/coders/yaml_column.rb +18 -21
  62. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +422 -243
  63. data/lib/active_record/connection_adapters/abstract/database_limits.rb +9 -0
  64. data/lib/active_record/connection_adapters/abstract/database_statements.rb +170 -194
  65. data/lib/active_record/connection_adapters/abstract/query_cache.rb +32 -19
  66. data/lib/active_record/connection_adapters/abstract/quoting.rb +79 -57
  67. data/lib/active_record/connection_adapters/abstract/savepoints.rb +21 -0
  68. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +125 -0
  69. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +273 -170
  70. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +50 -0
  71. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +731 -254
  72. data/lib/active_record/connection_adapters/abstract/transaction.rb +215 -0
  73. data/lib/active_record/connection_adapters/abstract_adapter.rb +339 -95
  74. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +946 -0
  75. data/lib/active_record/connection_adapters/column.rb +33 -221
  76. data/lib/active_record/connection_adapters/connection_specification.rb +275 -0
  77. data/lib/active_record/connection_adapters/mysql2_adapter.rb +140 -602
  78. data/lib/active_record/connection_adapters/mysql_adapter.rb +254 -756
  79. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +93 -0
  80. data/lib/active_record/connection_adapters/postgresql/column.rb +20 -0
  81. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +232 -0
  82. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +100 -0
  83. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +52 -0
  84. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +13 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +15 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +46 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +11 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +36 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +13 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +19 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +21 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +59 -0
  93. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +13 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +13 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +11 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +35 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +23 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +43 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +43 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +79 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +19 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +11 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +109 -0
  104. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +21 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +26 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +28 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +36 -0
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +108 -0
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +30 -0
  110. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +152 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +596 -0
  112. data/lib/active_record/connection_adapters/postgresql/utils.rb +77 -0
  113. data/lib/active_record/connection_adapters/postgresql_adapter.rb +445 -902
  114. data/lib/active_record/connection_adapters/schema_cache.rb +94 -0
  115. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +578 -25
  116. data/lib/active_record/connection_handling.rb +132 -0
  117. data/lib/active_record/core.rb +579 -0
  118. data/lib/active_record/counter_cache.rb +159 -102
  119. data/lib/active_record/dynamic_matchers.rb +140 -0
  120. data/lib/active_record/enum.rb +197 -0
  121. data/lib/active_record/errors.rb +102 -34
  122. data/lib/active_record/explain.rb +38 -0
  123. data/lib/active_record/explain_registry.rb +30 -0
  124. data/lib/active_record/explain_subscriber.rb +29 -0
  125. data/lib/active_record/fixture_set/file.rb +56 -0
  126. data/lib/active_record/fixtures.rb +318 -260
  127. data/lib/active_record/gem_version.rb +15 -0
  128. data/lib/active_record/inheritance.rb +247 -0
  129. data/lib/active_record/integration.rb +113 -0
  130. data/lib/active_record/legacy_yaml_adapter.rb +30 -0
  131. data/lib/active_record/locale/en.yml +8 -1
  132. data/lib/active_record/locking/optimistic.rb +80 -52
  133. data/lib/active_record/locking/pessimistic.rb +27 -5
  134. data/lib/active_record/log_subscriber.rb +25 -18
  135. data/lib/active_record/migration/command_recorder.rb +130 -38
  136. data/lib/active_record/migration/join_table.rb +15 -0
  137. data/lib/active_record/migration.rb +532 -201
  138. data/lib/active_record/model_schema.rb +342 -0
  139. data/lib/active_record/nested_attributes.rb +229 -139
  140. data/lib/active_record/no_touching.rb +52 -0
  141. data/lib/active_record/null_relation.rb +81 -0
  142. data/lib/active_record/persistence.rb +304 -99
  143. data/lib/active_record/query_cache.rb +25 -43
  144. data/lib/active_record/querying.rb +68 -0
  145. data/lib/active_record/railtie.rb +86 -45
  146. data/lib/active_record/railties/console_sandbox.rb +3 -4
  147. data/lib/active_record/railties/controller_runtime.rb +7 -4
  148. data/lib/active_record/railties/databases.rake +198 -377
  149. data/lib/active_record/railties/jdbcmysql_error.rb +2 -2
  150. data/lib/active_record/readonly_attributes.rb +23 -0
  151. data/lib/active_record/reflection.rb +516 -165
  152. data/lib/active_record/relation/batches.rb +96 -45
  153. data/lib/active_record/relation/calculations.rb +221 -144
  154. data/lib/active_record/relation/delegation.rb +140 -0
  155. data/lib/active_record/relation/finder_methods.rb +362 -243
  156. data/lib/active_record/relation/merger.rb +193 -0
  157. data/lib/active_record/relation/predicate_builder/array_handler.rb +48 -0
  158. data/lib/active_record/relation/predicate_builder/relation_handler.rb +13 -0
  159. data/lib/active_record/relation/predicate_builder.rb +135 -41
  160. data/lib/active_record/relation/query_methods.rb +982 -155
  161. data/lib/active_record/relation/spawn_methods.rb +50 -110
  162. data/lib/active_record/relation.rb +371 -180
  163. data/lib/active_record/result.rb +109 -12
  164. data/lib/active_record/runtime_registry.rb +22 -0
  165. data/lib/active_record/sanitization.rb +191 -0
  166. data/lib/active_record/schema.rb +19 -13
  167. data/lib/active_record/schema_dumper.rb +111 -61
  168. data/lib/active_record/schema_migration.rb +53 -0
  169. data/lib/active_record/scoping/default.rb +135 -0
  170. data/lib/active_record/scoping/named.rb +164 -0
  171. data/lib/active_record/scoping.rb +87 -0
  172. data/lib/active_record/serialization.rb +7 -45
  173. data/lib/active_record/serializers/xml_serializer.rb +14 -65
  174. data/lib/active_record/statement_cache.rb +111 -0
  175. data/lib/active_record/store.rb +205 -0
  176. data/lib/active_record/tasks/database_tasks.rb +299 -0
  177. data/lib/active_record/tasks/mysql_database_tasks.rb +159 -0
  178. data/lib/active_record/tasks/postgresql_database_tasks.rb +101 -0
  179. data/lib/active_record/tasks/sqlite_database_tasks.rb +55 -0
  180. data/lib/active_record/timestamp.rb +35 -14
  181. data/lib/active_record/transactions.rb +141 -74
  182. data/lib/active_record/translation.rb +22 -0
  183. data/lib/active_record/type/big_integer.rb +13 -0
  184. data/lib/active_record/type/binary.rb +50 -0
  185. data/lib/active_record/type/boolean.rb +31 -0
  186. data/lib/active_record/type/date.rb +50 -0
  187. data/lib/active_record/type/date_time.rb +54 -0
  188. data/lib/active_record/type/decimal.rb +64 -0
  189. data/lib/active_record/type/decimal_without_scale.rb +11 -0
  190. data/lib/active_record/type/decorator.rb +14 -0
  191. data/lib/active_record/type/float.rb +19 -0
  192. data/lib/active_record/type/hash_lookup_type_map.rb +23 -0
  193. data/lib/active_record/type/integer.rb +59 -0
  194. data/lib/active_record/type/mutable.rb +16 -0
  195. data/lib/active_record/type/numeric.rb +36 -0
  196. data/lib/active_record/type/serialized.rb +62 -0
  197. data/lib/active_record/type/string.rb +40 -0
  198. data/lib/active_record/type/text.rb +11 -0
  199. data/lib/active_record/type/time.rb +26 -0
  200. data/lib/active_record/type/time_value.rb +38 -0
  201. data/lib/active_record/type/type_map.rb +64 -0
  202. data/lib/active_record/type/unsigned_integer.rb +15 -0
  203. data/lib/active_record/type/value.rb +110 -0
  204. data/lib/active_record/type.rb +23 -0
  205. data/lib/active_record/validations/associated.rb +27 -18
  206. data/lib/active_record/validations/presence.rb +67 -0
  207. data/lib/active_record/validations/uniqueness.rb +125 -66
  208. data/lib/active_record/validations.rb +37 -30
  209. data/lib/active_record/version.rb +5 -7
  210. data/lib/active_record.rb +80 -25
  211. data/lib/rails/generators/active_record/migration/migration_generator.rb +54 -9
  212. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +19 -0
  213. data/lib/rails/generators/active_record/migration/templates/migration.rb +25 -11
  214. data/lib/rails/generators/active_record/migration.rb +11 -8
  215. data/lib/rails/generators/active_record/model/model_generator.rb +17 -4
  216. data/lib/rails/generators/active_record/model/templates/model.rb +5 -2
  217. data/lib/rails/generators/active_record/model/templates/module.rb +1 -1
  218. data/lib/rails/generators/active_record.rb +3 -11
  219. metadata +132 -53
  220. data/examples/associations.png +0 -0
  221. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +0 -62
  222. data/lib/active_record/associations/join_helper.rb +0 -55
  223. data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +0 -60
  224. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +0 -135
  225. data/lib/active_record/connection_adapters/sqlite_adapter.rb +0 -556
  226. data/lib/active_record/dynamic_finder_match.rb +0 -56
  227. data/lib/active_record/dynamic_scope_match.rb +0 -23
  228. data/lib/active_record/identity_map.rb +0 -163
  229. data/lib/active_record/named_scope.rb +0 -200
  230. data/lib/active_record/observer.rb +0 -121
  231. data/lib/active_record/session_store.rb +0 -358
  232. data/lib/active_record/test_case.rb +0 -69
  233. data/lib/rails/generators/active_record/model/templates/migration.rb +0 -17
  234. data/lib/rails/generators/active_record/observer/observer_generator.rb +0 -15
  235. data/lib/rails/generators/active_record/observer/templates/observer.rb +0 -4
  236. data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +0 -25
  237. data/lib/rails/generators/active_record/session_migration/templates/migration.rb +0 -16
@@ -0,0 +1,68 @@
1
+ module ActiveRecord
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
5
+ delegate :first_or_create, :first_or_create!, :first_or_initialize, to: :all
6
+ delegate :find_or_create_by, :find_or_create_by!, :find_or_initialize_by, to: :all
7
+ delegate :find_by, :find_by!, to: :all
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,
11
+ :where, :rewhere, :preload, :eager_load, :includes, :from, :lock, :readonly,
12
+ :having, :create_with, :uniq, :distinct, :references, :none, :unscope, to: :all
13
+ delegate :count, :average, :minimum, :maximum, :sum, :calculate, to: :all
14
+ delegate :pluck, :ids, to: :all
15
+
16
+ # Executes a custom SQL query against your database and returns all the results. The results will
17
+ # be returned as an array with columns requested encapsulated as attributes of the model you call
18
+ # this method from. If you call <tt>Product.find_by_sql</tt> then the results will be returned in
19
+ # a +Product+ object with the attributes you specified in the SQL query.
20
+ #
21
+ # If you call a complicated SQL query which spans multiple tables the columns specified by the
22
+ # SELECT will be attributes of the model, whether or not they are columns of the corresponding
23
+ # table.
24
+ #
25
+ # The +sql+ parameter is a full SQL query as a string. It will be called as is, there will be
26
+ # no database agnostic conversions performed. This should be a last resort because using, for example,
27
+ # MySQL specific terms will lock you to using that particular database engine or require you to
28
+ # change your call if you switch engines.
29
+ #
30
+ # # A simple SQL query spanning multiple tables
31
+ # Post.find_by_sql "SELECT p.title, c.author FROM posts p, comments c WHERE p.id = c.post_id"
32
+ # # => [#<Post:0x36bff9c @attributes={"title"=>"Ruby Meetup", "first_name"=>"Quentin"}>, ...]
33
+ #
34
+ # You can use the same string replacement techniques as you can with <tt>ActiveRecord::QueryMethods#where</tt>:
35
+ #
36
+ # Post.find_by_sql ["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date]
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)
40
+ column_types = result_set.column_types.dup
41
+ columns_hash.each_key { |k| column_types.delete k }
42
+ message_bus = ActiveSupport::Notifications.instrumenter
43
+
44
+ payload = {
45
+ record_count: result_set.length,
46
+ class_name: name
47
+ }
48
+
49
+ message_bus.instrument('instantiation.active_record', payload) do
50
+ result_set.map { |record| instantiate(record, column_types) }
51
+ end
52
+ end
53
+
54
+ # Returns the result of an SQL statement that should only include a COUNT(*) in the SELECT part.
55
+ # The use of this method should be restricted to complicated SQL queries that can't be executed
56
+ # using the ActiveRecord::Calculations class methods. Look into those before using this.
57
+ #
58
+ # ==== Parameters
59
+ #
60
+ # * +sql+ - An SQL statement which should return a count query from the database, see the example below.
61
+ #
62
+ # Product.count_by_sql "SELECT COUNT(*) FROM sales s, customers c WHERE s.customer_id = c.id"
63
+ def count_by_sql(sql)
64
+ sql = sanitize_conditions(sql)
65
+ connection.select_value(sql, "#{name} Count").to_i
66
+ end
67
+ end
68
+ end
@@ -10,7 +10,7 @@ require "action_controller/railtie"
10
10
 
11
11
  module ActiveRecord
12
12
  # = Active Record Railtie
13
- class Railtie < Rails::Railtie
13
+ class Railtie < Rails::Railtie # :nodoc:
14
14
  config.active_record = ActiveSupport::OrderedOptions.new
15
15
 
16
16
  config.app_generators.orm :active_record, :migration => true,
@@ -22,7 +22,32 @@ module ActiveRecord
22
22
  config.app_middleware.insert_after "::ActionDispatch::Callbacks",
23
23
  "ActiveRecord::ConnectionAdapters::ConnectionManagement"
24
24
 
25
+ config.action_dispatch.rescue_responses.merge!(
26
+ 'ActiveRecord::RecordNotFound' => :not_found,
27
+ 'ActiveRecord::StaleObjectError' => :conflict,
28
+ 'ActiveRecord::RecordInvalid' => :unprocessable_entity,
29
+ 'ActiveRecord::RecordNotSaved' => :unprocessable_entity
30
+ )
31
+
32
+
33
+ config.active_record.use_schema_cache_dump = true
34
+ config.active_record.maintain_test_schema = true
35
+
36
+ config.eager_load_namespaces << ActiveRecord
37
+
25
38
  rake_tasks do
39
+ namespace :db do
40
+ task :load_config do
41
+ ActiveRecord::Tasks::DatabaseTasks.database_configuration = Rails.application.config.database_configuration
42
+
43
+ if defined?(ENGINE_PATH) && engine = Rails::Engine.find(ENGINE_PATH)
44
+ if engine.paths['db/migrate'].existent
45
+ ActiveRecord::Tasks::DatabaseTasks.migrations_paths += engine.paths['db/migrate'].to_a
46
+ end
47
+ end
48
+ end
49
+ end
50
+
26
51
  load "active_record/railties/databases.rake"
27
52
  end
28
53
 
@@ -31,7 +56,15 @@ module ActiveRecord
31
56
  # first time. Also, make it output to STDERR.
32
57
  console do |app|
33
58
  require "active_record/railties/console_sandbox" if app.sandbox?
34
- ActiveRecord::Base.logger = Logger.new(STDERR)
59
+ require "active_record/base"
60
+ unless ActiveSupport::Logger.logger_outputs_to?(Rails.logger, STDERR, STDOUT)
61
+ console = ActiveSupport::Logger.new(STDERR)
62
+ Rails.logger.extend ActiveSupport::Logger.broadcast console
63
+ end
64
+ end
65
+
66
+ runner do
67
+ require "active_record/base"
35
68
  end
36
69
 
37
70
  initializer "active_record.initialize_timezone" do
@@ -45,16 +78,34 @@ module ActiveRecord
45
78
  ActiveSupport.on_load(:active_record) { self.logger ||= ::Rails.logger }
46
79
  end
47
80
 
48
- initializer "active_record.identity_map" do |app|
49
- config.app_middleware.insert_after "::ActionDispatch::Callbacks",
50
- "ActiveRecord::IdentityMap::Middleware" if config.active_record.delete(:identity_map)
81
+ initializer "active_record.migration_error" do
82
+ if config.active_record.delete(:migration_error) == :page_load
83
+ config.app_middleware.insert_after "::ActionDispatch::Callbacks",
84
+ "ActiveRecord::Migration::CheckPending"
85
+ end
86
+ end
87
+
88
+ initializer "active_record.check_schema_cache_dump" do
89
+ if config.active_record.delete(:use_schema_cache_dump)
90
+ config.after_initialize do |app|
91
+ ActiveSupport.on_load(:active_record) do
92
+ filename = File.join(app.config.paths["db"].first, "schema_cache.dump")
93
+
94
+ if File.file?(filename)
95
+ cache = Marshal.load File.binread filename
96
+ if cache.version == ActiveRecord::Migrator.current_version
97
+ self.connection.schema_cache = cache
98
+ else
99
+ 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
+ end
101
+ end
102
+ end
103
+ end
104
+ end
51
105
  end
52
106
 
53
107
  initializer "active_record.set_configs" do |app|
54
108
  ActiveSupport.on_load(:active_record) do
55
- if app.config.active_record.delete(:whitelist_attributes)
56
- attr_accessible(nil)
57
- end
58
109
  app.config.active_record.each do |k,v|
59
110
  send "#{k}=", v
60
111
  end
@@ -65,59 +116,49 @@ module ActiveRecord
65
116
  # and then establishes the connection.
66
117
  initializer "active_record.initialize_database" do |app|
67
118
  ActiveSupport.on_load(:active_record) do
68
- self.configurations = app.config.database_configuration
69
- establish_connection
119
+ self.configurations = Rails.application.config.database_configuration
120
+
121
+ begin
122
+ establish_connection
123
+ rescue ActiveRecord::NoDatabaseError
124
+ warn <<-end_warning
125
+ Oops - You have a database configured, but it doesn't exist yet!
126
+
127
+ Here's how to get started:
128
+
129
+ 1. Configure your database in config/database.yml.
130
+ 2. Run `bin/rake db:create` to create the database.
131
+ 3. Run `bin/rake db:setup` to load your database schema.
132
+ end_warning
133
+ raise
134
+ end
70
135
  end
71
136
  end
72
137
 
73
138
  # Expose database runtime to controller for logging.
74
- initializer "active_record.log_runtime" do |app|
139
+ initializer "active_record.log_runtime" do
75
140
  require "active_record/railties/controller_runtime"
76
141
  ActiveSupport.on_load(:action_controller) do
77
142
  include ActiveRecord::Railties::ControllerRuntime
78
143
  end
79
144
  end
80
145
 
81
- initializer "active_record.set_dispatch_hooks", :before => :set_clear_dependencies_hook do |app|
82
- ActiveSupport.on_load(:active_record) do
83
- ActionDispatch::Reloader.to_cleanup do
84
- ActiveRecord::Base.clear_reloadable_connections!
85
- ActiveRecord::Base.clear_cache!
86
- end
87
- end
88
- end
146
+ initializer "active_record.set_reloader_hooks" do |app|
147
+ hook = app.config.reload_classes_only_on_change ? :to_prepare : :to_cleanup
89
148
 
90
- config.after_initialize do
91
149
  ActiveSupport.on_load(:active_record) do
92
- instantiate_observers
93
-
94
- ActionDispatch::Reloader.to_prepare do
95
- ActiveRecord::Base.instantiate_observers
96
- end
97
- end
98
- end
99
-
100
- config.after_initialize do
101
- container = :"activerecord.attributes"
102
- lookup = I18n.t(container, :default => {})
103
- if lookup.is_a?(Hash)
104
- lookup.each do |key, value|
105
- if value.is_a?(Hash) && value.any? { |k,v| v.is_a?(Hash) }
106
- $stderr.puts "[DEPRECATION WARNING] Nested I18n namespace lookup under \"#{container}.#{key}\" is no longer supported"
107
- end
108
- end
109
- end
110
-
111
- container = :"activerecord.models"
112
- lookup = I18n.t(container, :default => {})
113
- if lookup.is_a?(Hash)
114
- lookup.each do |key, value|
115
- if value.is_a?(Hash) && !value.key?(:one)
116
- $stderr.puts "[DEPRECATION WARNING] Nested I18n namespace lookup under \"#{container}.#{key}\" is no longer supported"
150
+ ActionDispatch::Reloader.send(hook) do
151
+ if ActiveRecord::Base.connected?
152
+ ActiveRecord::Base.clear_cache!
153
+ ActiveRecord::Base.clear_reloadable_connections!
117
154
  end
118
155
  end
119
156
  end
120
157
  end
121
158
 
159
+ initializer "active_record.add_watchable_files" do |app|
160
+ path = app.paths["db"].first
161
+ config.watchable_files.concat ["#{path}/schema.rb", "#{path}/structure.sql"]
162
+ end
122
163
  end
123
164
  end
@@ -1,6 +1,5 @@
1
- ActiveRecord::Base.connection.increment_open_transactions
2
- ActiveRecord::Base.connection.begin_db_transaction
1
+ ActiveRecord::Base.connection.begin_transaction(joinable: false)
2
+
3
3
  at_exit do
4
- ActiveRecord::Base.connection.rollback_db_transaction
5
- ActiveRecord::Base.connection.decrement_open_transactions
4
+ ActiveRecord::Base.connection.rollback_transaction
6
5
  end
@@ -2,7 +2,7 @@ require 'active_support/core_ext/module/attr_internal'
2
2
  require 'active_record/log_subscriber'
3
3
 
4
4
  module ActiveRecord
5
- module Railties
5
+ module Railties # :nodoc:
6
6
  module ControllerRuntime #:nodoc:
7
7
  extend ActiveSupport::Concern
8
8
 
@@ -21,9 +21,10 @@ module ActiveRecord
21
21
  def cleanup_view_runtime
22
22
  if ActiveRecord::Base.connected?
23
23
  db_rt_before_render = ActiveRecord::LogSubscriber.reset_runtime
24
+ self.db_runtime = (db_runtime || 0) + db_rt_before_render
24
25
  runtime = super
25
26
  db_rt_after_render = ActiveRecord::LogSubscriber.reset_runtime
26
- self.db_runtime = db_rt_before_render + db_rt_after_render
27
+ self.db_runtime += db_rt_after_render
27
28
  runtime - db_rt_after_render
28
29
  else
29
30
  super
@@ -32,10 +33,12 @@ module ActiveRecord
32
33
 
33
34
  def append_info_to_payload(payload)
34
35
  super
35
- payload[:db_runtime] = db_runtime
36
+ if ActiveRecord::Base.connected?
37
+ payload[:db_runtime] = (db_runtime || 0) + ActiveRecord::LogSubscriber.reset_runtime
38
+ end
36
39
  end
37
40
 
38
- module ClassMethods
41
+ module ClassMethods # :nodoc:
39
42
  def log_process_action(payload)
40
43
  messages, db_runtime = super, payload[:db_runtime]
41
44
  messages << ("ActiveRecord: %.1fms" % db_runtime.to_f) if db_runtime