activerecord 3.2.6 → 6.0.0

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 (371) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +611 -6417
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +44 -47
  5. data/examples/performance.rb +79 -71
  6. data/examples/simple.rb +6 -5
  7. data/lib/active_record/aggregations.rb +268 -238
  8. data/lib/active_record/association_relation.rb +40 -0
  9. data/lib/active_record/associations/alias_tracker.rb +47 -42
  10. data/lib/active_record/associations/association.rb +173 -81
  11. data/lib/active_record/associations/association_scope.rb +124 -92
  12. data/lib/active_record/associations/belongs_to_association.rb +83 -38
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +11 -9
  14. data/lib/active_record/associations/builder/association.rb +113 -32
  15. data/lib/active_record/associations/builder/belongs_to.rb +105 -60
  16. data/lib/active_record/associations/builder/collection_association.rb +53 -56
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +98 -41
  18. data/lib/active_record/associations/builder/has_many.rb +11 -63
  19. data/lib/active_record/associations/builder/has_one.rb +47 -45
  20. data/lib/active_record/associations/builder/singular_association.rb +30 -18
  21. data/lib/active_record/associations/collection_association.rb +217 -295
  22. data/lib/active_record/associations/collection_proxy.rb +1074 -77
  23. data/lib/active_record/associations/foreign_association.rb +20 -0
  24. data/lib/active_record/associations/has_many_association.rb +78 -50
  25. data/lib/active_record/associations/has_many_through_association.rb +99 -61
  26. data/lib/active_record/associations/has_one_association.rb +75 -30
  27. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  28. data/lib/active_record/associations/join_dependency/join_association.rb +45 -119
  29. data/lib/active_record/associations/join_dependency/join_base.rb +11 -12
  30. data/lib/active_record/associations/join_dependency/join_part.rb +35 -42
  31. data/lib/active_record/associations/join_dependency.rb +208 -164
  32. data/lib/active_record/associations/preloader/association.rb +93 -87
  33. data/lib/active_record/associations/preloader/through_association.rb +87 -38
  34. data/lib/active_record/associations/preloader.rb +134 -110
  35. data/lib/active_record/associations/singular_association.rb +19 -24
  36. data/lib/active_record/associations/through_association.rb +61 -27
  37. data/lib/active_record/associations.rb +1766 -1505
  38. data/lib/active_record/attribute_assignment.rb +57 -193
  39. data/lib/active_record/attribute_decorators.rb +90 -0
  40. data/lib/active_record/attribute_methods/before_type_cast.rb +58 -8
  41. data/lib/active_record/attribute_methods/dirty.rb +187 -67
  42. data/lib/active_record/attribute_methods/primary_key.rb +100 -78
  43. data/lib/active_record/attribute_methods/query.rb +10 -8
  44. data/lib/active_record/attribute_methods/read.rb +29 -118
  45. data/lib/active_record/attribute_methods/serialization.rb +60 -72
  46. data/lib/active_record/attribute_methods/time_zone_conversion.rb +69 -42
  47. data/lib/active_record/attribute_methods/write.rb +36 -44
  48. data/lib/active_record/attribute_methods.rb +306 -161
  49. data/lib/active_record/attributes.rb +279 -0
  50. data/lib/active_record/autosave_association.rb +324 -238
  51. data/lib/active_record/base.rb +114 -507
  52. data/lib/active_record/callbacks.rb +147 -83
  53. data/lib/active_record/coders/json.rb +15 -0
  54. data/lib/active_record/coders/yaml_column.rb +32 -23
  55. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +962 -279
  56. data/lib/active_record/connection_adapters/abstract/database_limits.rb +32 -5
  57. data/lib/active_record/connection_adapters/abstract/database_statements.rb +331 -209
  58. data/lib/active_record/connection_adapters/abstract/query_cache.rb +95 -23
  59. data/lib/active_record/connection_adapters/abstract/quoting.rb +201 -65
  60. data/lib/active_record/connection_adapters/abstract/savepoints.rb +23 -0
  61. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -0
  62. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +510 -289
  63. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +93 -0
  64. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1182 -313
  65. data/lib/active_record/connection_adapters/abstract/transaction.rb +323 -0
  66. data/lib/active_record/connection_adapters/abstract_adapter.rb +585 -120
  67. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +610 -463
  68. data/lib/active_record/connection_adapters/column.rb +58 -233
  69. data/lib/active_record/connection_adapters/connection_specification.rb +297 -0
  70. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
  71. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  72. data/lib/active_record/connection_adapters/mysql/database_statements.rb +200 -0
  73. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +72 -0
  74. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  75. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +72 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  79. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  80. data/lib/active_record/connection_adapters/mysql2_adapter.rb +75 -207
  81. data/lib/active_record/connection_adapters/postgresql/column.rb +30 -0
  82. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +182 -0
  83. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  84. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +92 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +53 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +15 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +17 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +50 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +23 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +15 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +21 -0
  93. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +71 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +15 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +15 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +41 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +15 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +65 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +97 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +18 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +113 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +26 -0
  104. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +28 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +30 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid.rb +34 -0
  107. data/lib/active_record/connection_adapters/postgresql/quoting.rb +205 -0
  108. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +43 -0
  109. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  110. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +222 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +50 -0
  112. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +776 -0
  113. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  114. data/lib/active_record/connection_adapters/postgresql/utils.rb +81 -0
  115. data/lib/active_record/connection_adapters/postgresql_adapter.rb +695 -1052
  116. data/lib/active_record/connection_adapters/schema_cache.rb +115 -24
  117. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  118. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +118 -0
  119. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  120. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +103 -0
  121. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  125. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +528 -26
  126. data/lib/active_record/connection_adapters/statement_pool.rb +34 -13
  127. data/lib/active_record/connection_handling.rb +267 -0
  128. data/lib/active_record/core.rb +599 -0
  129. data/lib/active_record/counter_cache.rb +177 -103
  130. data/lib/active_record/database_configurations/database_config.rb +37 -0
  131. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  132. data/lib/active_record/database_configurations/url_config.rb +79 -0
  133. data/lib/active_record/database_configurations.rb +233 -0
  134. data/lib/active_record/define_callbacks.rb +22 -0
  135. data/lib/active_record/dynamic_matchers.rb +107 -64
  136. data/lib/active_record/enum.rb +274 -0
  137. data/lib/active_record/errors.rb +254 -61
  138. data/lib/active_record/explain.rb +35 -70
  139. data/lib/active_record/explain_registry.rb +32 -0
  140. data/lib/active_record/explain_subscriber.rb +18 -8
  141. data/lib/active_record/fixture_set/file.rb +82 -0
  142. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  143. data/lib/active_record/fixture_set/render_context.rb +17 -0
  144. data/lib/active_record/fixture_set/table_row.rb +153 -0
  145. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  146. data/lib/active_record/fixtures.rb +291 -475
  147. data/lib/active_record/gem_version.rb +17 -0
  148. data/lib/active_record/inheritance.rb +219 -100
  149. data/lib/active_record/insert_all.rb +179 -0
  150. data/lib/active_record/integration.rb +175 -17
  151. data/lib/active_record/internal_metadata.rb +53 -0
  152. data/lib/active_record/legacy_yaml_adapter.rb +48 -0
  153. data/lib/active_record/locale/en.yml +9 -1
  154. data/lib/active_record/locking/optimistic.rb +106 -92
  155. data/lib/active_record/locking/pessimistic.rb +23 -11
  156. data/lib/active_record/log_subscriber.rb +80 -30
  157. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  158. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  159. data/lib/active_record/middleware/database_selector.rb +75 -0
  160. data/lib/active_record/migration/command_recorder.rb +235 -56
  161. data/lib/active_record/migration/compatibility.rb +244 -0
  162. data/lib/active_record/migration/join_table.rb +17 -0
  163. data/lib/active_record/migration.rb +917 -301
  164. data/lib/active_record/model_schema.rb +351 -175
  165. data/lib/active_record/nested_attributes.rb +366 -235
  166. data/lib/active_record/no_touching.rb +65 -0
  167. data/lib/active_record/null_relation.rb +68 -0
  168. data/lib/active_record/persistence.rb +761 -166
  169. data/lib/active_record/query_cache.rb +22 -44
  170. data/lib/active_record/querying.rb +55 -31
  171. data/lib/active_record/railtie.rb +185 -47
  172. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  173. data/lib/active_record/railties/console_sandbox.rb +5 -4
  174. data/lib/active_record/railties/controller_runtime.rb +35 -33
  175. data/lib/active_record/railties/databases.rake +366 -463
  176. data/lib/active_record/readonly_attributes.rb +4 -6
  177. data/lib/active_record/reflection.rb +736 -228
  178. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  179. data/lib/active_record/relation/batches.rb +252 -52
  180. data/lib/active_record/relation/calculations.rb +340 -270
  181. data/lib/active_record/relation/delegation.rb +117 -36
  182. data/lib/active_record/relation/finder_methods.rb +439 -286
  183. data/lib/active_record/relation/from_clause.rb +26 -0
  184. data/lib/active_record/relation/merger.rb +184 -0
  185. data/lib/active_record/relation/predicate_builder/array_handler.rb +49 -0
  186. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  187. data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
  188. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  189. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  190. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  191. data/lib/active_record/relation/predicate_builder/relation_handler.rb +19 -0
  192. data/lib/active_record/relation/predicate_builder.rb +131 -39
  193. data/lib/active_record/relation/query_attribute.rb +50 -0
  194. data/lib/active_record/relation/query_methods.rb +1163 -221
  195. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  196. data/lib/active_record/relation/spawn_methods.rb +49 -120
  197. data/lib/active_record/relation/where_clause.rb +190 -0
  198. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  199. data/lib/active_record/relation.rb +671 -349
  200. data/lib/active_record/result.rb +149 -15
  201. data/lib/active_record/runtime_registry.rb +24 -0
  202. data/lib/active_record/sanitization.rb +153 -133
  203. data/lib/active_record/schema.rb +22 -19
  204. data/lib/active_record/schema_dumper.rb +178 -112
  205. data/lib/active_record/schema_migration.rb +60 -0
  206. data/lib/active_record/scoping/default.rb +107 -98
  207. data/lib/active_record/scoping/named.rb +130 -115
  208. data/lib/active_record/scoping.rb +77 -123
  209. data/lib/active_record/secure_token.rb +40 -0
  210. data/lib/active_record/serialization.rb +10 -6
  211. data/lib/active_record/statement_cache.rb +148 -0
  212. data/lib/active_record/store.rb +256 -16
  213. data/lib/active_record/suppressor.rb +61 -0
  214. data/lib/active_record/table_metadata.rb +75 -0
  215. data/lib/active_record/tasks/database_tasks.rb +506 -0
  216. data/lib/active_record/tasks/mysql_database_tasks.rb +115 -0
  217. data/lib/active_record/tasks/postgresql_database_tasks.rb +141 -0
  218. data/lib/active_record/tasks/sqlite_database_tasks.rb +77 -0
  219. data/lib/active_record/test_databases.rb +23 -0
  220. data/lib/active_record/test_fixtures.rb +224 -0
  221. data/lib/active_record/timestamp.rb +93 -39
  222. data/lib/active_record/touch_later.rb +66 -0
  223. data/lib/active_record/transactions.rb +260 -129
  224. data/lib/active_record/translation.rb +3 -1
  225. data/lib/active_record/type/adapter_specific_registry.rb +129 -0
  226. data/lib/active_record/type/date.rb +9 -0
  227. data/lib/active_record/type/date_time.rb +9 -0
  228. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  229. data/lib/active_record/type/hash_lookup_type_map.rb +25 -0
  230. data/lib/active_record/type/internal/timezone.rb +17 -0
  231. data/lib/active_record/type/json.rb +30 -0
  232. data/lib/active_record/type/serialized.rb +71 -0
  233. data/lib/active_record/type/text.rb +11 -0
  234. data/lib/active_record/type/time.rb +21 -0
  235. data/lib/active_record/type/type_map.rb +62 -0
  236. data/lib/active_record/type/unsigned_integer.rb +17 -0
  237. data/lib/active_record/type.rb +78 -0
  238. data/lib/active_record/type_caster/connection.rb +34 -0
  239. data/lib/active_record/type_caster/map.rb +20 -0
  240. data/lib/active_record/type_caster.rb +9 -0
  241. data/lib/active_record/validations/absence.rb +25 -0
  242. data/lib/active_record/validations/associated.rb +35 -18
  243. data/lib/active_record/validations/length.rb +26 -0
  244. data/lib/active_record/validations/presence.rb +68 -0
  245. data/lib/active_record/validations/uniqueness.rb +123 -77
  246. data/lib/active_record/validations.rb +54 -43
  247. data/lib/active_record/version.rb +7 -7
  248. data/lib/active_record.rb +97 -49
  249. data/lib/arel/alias_predication.rb +9 -0
  250. data/lib/arel/attributes/attribute.rb +37 -0
  251. data/lib/arel/attributes.rb +22 -0
  252. data/lib/arel/collectors/bind.rb +24 -0
  253. data/lib/arel/collectors/composite.rb +31 -0
  254. data/lib/arel/collectors/plain_string.rb +20 -0
  255. data/lib/arel/collectors/sql_string.rb +20 -0
  256. data/lib/arel/collectors/substitute_binds.rb +28 -0
  257. data/lib/arel/crud.rb +42 -0
  258. data/lib/arel/delete_manager.rb +18 -0
  259. data/lib/arel/errors.rb +9 -0
  260. data/lib/arel/expressions.rb +29 -0
  261. data/lib/arel/factory_methods.rb +49 -0
  262. data/lib/arel/insert_manager.rb +49 -0
  263. data/lib/arel/math.rb +45 -0
  264. data/lib/arel/nodes/and.rb +32 -0
  265. data/lib/arel/nodes/ascending.rb +23 -0
  266. data/lib/arel/nodes/binary.rb +52 -0
  267. data/lib/arel/nodes/bind_param.rb +36 -0
  268. data/lib/arel/nodes/case.rb +55 -0
  269. data/lib/arel/nodes/casted.rb +50 -0
  270. data/lib/arel/nodes/comment.rb +29 -0
  271. data/lib/arel/nodes/count.rb +12 -0
  272. data/lib/arel/nodes/delete_statement.rb +45 -0
  273. data/lib/arel/nodes/descending.rb +23 -0
  274. data/lib/arel/nodes/equality.rb +18 -0
  275. data/lib/arel/nodes/extract.rb +24 -0
  276. data/lib/arel/nodes/false.rb +16 -0
  277. data/lib/arel/nodes/full_outer_join.rb +8 -0
  278. data/lib/arel/nodes/function.rb +44 -0
  279. data/lib/arel/nodes/grouping.rb +8 -0
  280. data/lib/arel/nodes/in.rb +8 -0
  281. data/lib/arel/nodes/infix_operation.rb +80 -0
  282. data/lib/arel/nodes/inner_join.rb +8 -0
  283. data/lib/arel/nodes/insert_statement.rb +37 -0
  284. data/lib/arel/nodes/join_source.rb +20 -0
  285. data/lib/arel/nodes/matches.rb +18 -0
  286. data/lib/arel/nodes/named_function.rb +23 -0
  287. data/lib/arel/nodes/node.rb +50 -0
  288. data/lib/arel/nodes/node_expression.rb +13 -0
  289. data/lib/arel/nodes/outer_join.rb +8 -0
  290. data/lib/arel/nodes/over.rb +15 -0
  291. data/lib/arel/nodes/regexp.rb +16 -0
  292. data/lib/arel/nodes/right_outer_join.rb +8 -0
  293. data/lib/arel/nodes/select_core.rb +67 -0
  294. data/lib/arel/nodes/select_statement.rb +41 -0
  295. data/lib/arel/nodes/sql_literal.rb +16 -0
  296. data/lib/arel/nodes/string_join.rb +11 -0
  297. data/lib/arel/nodes/table_alias.rb +27 -0
  298. data/lib/arel/nodes/terminal.rb +16 -0
  299. data/lib/arel/nodes/true.rb +16 -0
  300. data/lib/arel/nodes/unary.rb +45 -0
  301. data/lib/arel/nodes/unary_operation.rb +20 -0
  302. data/lib/arel/nodes/unqualified_column.rb +22 -0
  303. data/lib/arel/nodes/update_statement.rb +41 -0
  304. data/lib/arel/nodes/values_list.rb +9 -0
  305. data/lib/arel/nodes/window.rb +126 -0
  306. data/lib/arel/nodes/with.rb +11 -0
  307. data/lib/arel/nodes.rb +68 -0
  308. data/lib/arel/order_predications.rb +13 -0
  309. data/lib/arel/predications.rb +257 -0
  310. data/lib/arel/select_manager.rb +271 -0
  311. data/lib/arel/table.rb +110 -0
  312. data/lib/arel/tree_manager.rb +72 -0
  313. data/lib/arel/update_manager.rb +34 -0
  314. data/lib/arel/visitors/depth_first.rb +204 -0
  315. data/lib/arel/visitors/dot.rb +297 -0
  316. data/lib/arel/visitors/ibm_db.rb +34 -0
  317. data/lib/arel/visitors/informix.rb +62 -0
  318. data/lib/arel/visitors/mssql.rb +157 -0
  319. data/lib/arel/visitors/mysql.rb +83 -0
  320. data/lib/arel/visitors/oracle.rb +159 -0
  321. data/lib/arel/visitors/oracle12.rb +66 -0
  322. data/lib/arel/visitors/postgresql.rb +110 -0
  323. data/lib/arel/visitors/sqlite.rb +39 -0
  324. data/lib/arel/visitors/to_sql.rb +889 -0
  325. data/lib/arel/visitors/visitor.rb +46 -0
  326. data/lib/arel/visitors/where_sql.rb +23 -0
  327. data/lib/arel/visitors.rb +20 -0
  328. data/lib/arel/window_predications.rb +9 -0
  329. data/lib/arel.rb +51 -0
  330. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  331. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  332. data/lib/rails/generators/active_record/migration/migration_generator.rb +59 -9
  333. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  334. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +48 -0
  335. data/lib/rails/generators/active_record/migration.rb +41 -8
  336. data/lib/rails/generators/active_record/model/model_generator.rb +24 -22
  337. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  338. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +1 -1
  339. data/lib/rails/generators/active_record.rb +10 -16
  340. metadata +285 -149
  341. data/examples/associations.png +0 -0
  342. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +0 -63
  343. data/lib/active_record/associations/join_helper.rb +0 -55
  344. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  345. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  346. data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +0 -60
  347. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  348. data/lib/active_record/associations/preloader/has_many_through.rb +0 -15
  349. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  350. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  351. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  352. data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +0 -32
  353. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +0 -188
  354. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -426
  355. data/lib/active_record/connection_adapters/sqlite_adapter.rb +0 -579
  356. data/lib/active_record/dynamic_finder_match.rb +0 -68
  357. data/lib/active_record/dynamic_scope_match.rb +0 -23
  358. data/lib/active_record/fixtures/file.rb +0 -65
  359. data/lib/active_record/identity_map.rb +0 -162
  360. data/lib/active_record/observer.rb +0 -121
  361. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  362. data/lib/active_record/serializers/xml_serializer.rb +0 -203
  363. data/lib/active_record/session_store.rb +0 -358
  364. data/lib/active_record/test_case.rb +0 -73
  365. data/lib/rails/generators/active_record/migration/templates/migration.rb +0 -34
  366. data/lib/rails/generators/active_record/model/templates/migration.rb +0 -15
  367. data/lib/rails/generators/active_record/model/templates/model.rb +0 -12
  368. data/lib/rails/generators/active_record/observer/observer_generator.rb +0 -15
  369. data/lib/rails/generators/active_record/observer/templates/observer.rb +0 -4
  370. data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +0 -25
  371. data/lib/rails/generators/active_record/session_migration/templates/migration.rb +0 -12
data/MIT-LICENSE CHANGED
@@ -1,4 +1,6 @@
1
- Copyright (c) 2004-2011 David Heinemeier Hansson
1
+ Copyright (c) 2004-2019 David Heinemeier Hansson
2
+
3
+ Arel originally copyright (c) 2007-2016 Nick Kallen, Bryan Helmkamp, Emilio Tagua, Aaron Patterson
2
4
 
3
5
  Permission is hereby granted, free of charge, to any person obtaining
4
6
  a copy of this software and associated documentation files (the
@@ -17,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
19
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
20
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
21
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc CHANGED
@@ -1,4 +1,4 @@
1
- = Active Record -- Object-relational mapping put on rails
1
+ = Active Record -- Object-relational mapping in Rails
2
2
 
3
3
  Active Record connects classes to relational database tables to establish an
4
4
  almost zero-configuration persistence layer for applications. The library
@@ -13,6 +13,8 @@ columns. Although these mappings can be defined explicitly, it's recommended
13
13
  to follow naming conventions, especially when getting started with the
14
14
  library.
15
15
 
16
+ You can read more about Active Record in the {Active Record Basics}[https://edgeguides.rubyonrails.org/active_record_basics.html] guide.
17
+
16
18
  A short rundown of some of the major features:
17
19
 
18
20
  * Automated mapping between classes and tables, attributes and columns.
@@ -20,19 +22,19 @@ A short rundown of some of the major features:
20
22
  class Product < ActiveRecord::Base
21
23
  end
22
24
 
23
- The Product class is automatically mapped to the table named "products",
24
- which might look like this:
25
+ {Learn more}[link:classes/ActiveRecord/Base.html]
26
+
27
+ The Product class is automatically mapped to the table named "products",
28
+ which might look like this:
25
29
 
26
30
  CREATE TABLE products (
27
- id int(11) NOT NULL auto_increment,
31
+ id bigint NOT NULL auto_increment,
28
32
  name varchar(255),
29
33
  PRIMARY KEY (id)
30
34
  );
31
35
 
32
- This would also define the following accessors: `Product#name` and
33
- `Product#name=(new_name)`
34
-
35
- {Learn more}[link:classes/ActiveRecord/Base.html]
36
+ This would also define the following accessors: <tt>Product#name</tt> and
37
+ <tt>Product#name=(new_name)</tt>.
36
38
 
37
39
 
38
40
  * Associations between objects defined by simple class methods.
@@ -49,10 +51,10 @@ A short rundown of some of the major features:
49
51
  * Aggregations of value objects.
50
52
 
51
53
  class Account < ActiveRecord::Base
52
- composed_of :balance, :class_name => "Money",
53
- :mapping => %w(balance amount)
54
+ composed_of :balance, class_name: 'Money',
55
+ mapping: %w(balance amount)
54
56
  composed_of :address,
55
- :mapping => [%w(address_street street), %w(address_city city)]
57
+ mapping: [%w(address_street street), %w(address_city city)]
56
58
  end
57
59
 
58
60
  {Learn more}[link:classes/ActiveRecord/Aggregations/ClassMethods.html]
@@ -61,10 +63,10 @@ A short rundown of some of the major features:
61
63
  * Validation rules that can differ for new or existing objects.
62
64
 
63
65
  class Account < ActiveRecord::Base
64
- validates_presence_of :subdomain, :name, :email_address, :password
65
- validates_uniqueness_of :subdomain
66
- validates_acceptance_of :terms_of_service, :on => :create
67
- validates_confirmation_of :password, :email_address, :on => :create
66
+ validates :subdomain, :name, :email_address, :password, presence: true
67
+ validates :subdomain, uniqueness: true
68
+ validates :terms_of_service, acceptance: true, on: :create
69
+ validates :password, :email_address, confirmation: true, on: :create
68
70
  end
69
71
 
70
72
  {Learn more}[link:classes/ActiveRecord/Validations.html]
@@ -80,17 +82,6 @@ A short rundown of some of the major features:
80
82
  {Learn more}[link:classes/ActiveRecord/Callbacks.html]
81
83
 
82
84
 
83
- * Observers that react to changes in a model.
84
-
85
- class CommentObserver < ActiveRecord::Observer
86
- def after_create(comment) # is called just after Comment#save
87
- CommentMailer.new_comment_email("david@loudthinking.com", comment).deliver
88
- end
89
- end
90
-
91
- {Learn more}[link:classes/ActiveRecord/Observer.html]
92
-
93
-
94
85
  * Inheritance hierarchies.
95
86
 
96
87
  class Company < ActiveRecord::Base; end
@@ -124,32 +115,32 @@ A short rundown of some of the major features:
124
115
  * Database abstraction through simple adapters.
125
116
 
126
117
  # connect to SQLite3
127
- ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => "dbfile.sqlite3")
118
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'dbfile.sqlite3')
128
119
 
129
120
  # connect to MySQL with authentication
130
121
  ActiveRecord::Base.establish_connection(
131
- :adapter => "mysql2",
132
- :host => "localhost",
133
- :username => "me",
134
- :password => "secret",
135
- :database => "activerecord"
122
+ adapter: 'mysql2',
123
+ host: 'localhost',
124
+ username: 'me',
125
+ password: 'secret',
126
+ database: 'activerecord'
136
127
  )
137
128
 
138
129
  {Learn more}[link:classes/ActiveRecord/Base.html] and read about the built-in support for
139
- MySQL[link:classes/ActiveRecord/ConnectionAdapters/MysqlAdapter.html],
130
+ MySQL[link:classes/ActiveRecord/ConnectionAdapters/Mysql2Adapter.html],
140
131
  PostgreSQL[link:classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html], and
141
132
  SQLite3[link:classes/ActiveRecord/ConnectionAdapters/SQLite3Adapter.html].
142
133
 
143
134
 
144
- * Logging support for Log4r[http://log4r.sourceforge.net] and Logger[http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc].
135
+ * Logging support for Log4r[https://github.com/colbygk/log4r] and Logger[http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc].
145
136
 
146
- ActiveRecord::Base.logger = Logger.new(STDOUT)
147
- ActiveRecord::Base.logger = Log4r::Logger.new("Application Log")
137
+ ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT)
138
+ ActiveRecord::Base.logger = Log4r::Logger.new('Application Log')
148
139
 
149
140
 
150
141
  * Database agnostic schema management with Migrations.
151
142
 
152
- class AddSystemSettings < ActiveRecord::Migration
143
+ class AddSystemSettings < ActiveRecord::Migration[5.0]
153
144
  def up
154
145
  create_table :system_settings do |t|
155
146
  t.string :name
@@ -159,7 +150,7 @@ A short rundown of some of the major features:
159
150
  t.integer :position
160
151
  end
161
152
 
162
- SystemSetting.create :name => "notice", :label => "Use notice?", :value => 1
153
+ SystemSetting.create name: 'notice', label: 'Use notice?', value: 1
163
154
  end
164
155
 
165
156
  def down
@@ -173,7 +164,7 @@ A short rundown of some of the major features:
173
164
  == Philosophy
174
165
 
175
166
  Active Record is an implementation of the object-relational mapping (ORM)
176
- pattern[http://www.martinfowler.com/eaaCatalog/activeRecord.html] by the same
167
+ pattern[https://www.martinfowler.com/eaaCatalog/activeRecord.html] by the same
177
168
  name described by Martin Fowler:
178
169
 
179
170
  "An object that wraps a row in a database table or view,
@@ -186,7 +177,7 @@ by relying on a number of conventions that make it easy for Active Record to inf
186
177
  complex relations and structures from a minimal amount of explicit direction.
187
178
 
188
179
  Convention over Configuration:
189
- * No XML-files!
180
+ * No XML files!
190
181
  * Lots of reflection and run-time extension
191
182
  * Magic is not inherently a bad word
192
183
 
@@ -199,24 +190,30 @@ Admit the Database:
199
190
 
200
191
  The latest version of Active Record can be installed with RubyGems:
201
192
 
202
- % [sudo] gem install activerecord
193
+ $ gem install activerecord
203
194
 
204
- Source code can be downloaded as part of the Rails project on GitHub
195
+ Source code can be downloaded as part of the Rails project on GitHub:
205
196
 
206
- * https://github.com/rails/rails/tree/3-2-stable/activerecord
197
+ * https://github.com/rails/rails/tree/master/activerecord
207
198
 
208
199
 
209
200
  == License
210
201
 
211
- Active Record is released under the MIT license.
202
+ Active Record is released under the MIT license:
203
+
204
+ * https://opensource.org/licenses/MIT
212
205
 
213
206
 
214
207
  == Support
215
208
 
216
- API documentation is at
209
+ API documentation is at:
217
210
 
218
- * http://api.rubyonrails.org
211
+ * https://api.rubyonrails.org
219
212
 
220
- Bug reports and feature requests can be filed with the rest for the Ruby on Rails project here:
213
+ Bug reports for the Ruby on Rails project can be filed here:
221
214
 
222
215
  * https://github.com/rails/rails/issues
216
+
217
+ Feature requests should be discussed on the rails-core mailing list here:
218
+
219
+ * https://groups.google.com/forum/?fromgroups#!forum/rubyonrails-core
@@ -1,14 +1,17 @@
1
- TIMES = (ENV['N'] || 10000).to_i
1
+ # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../../../load_paths', __FILE__)
4
3
  require "active_record"
4
+ require "benchmark/ips"
5
5
 
6
- conn = { :adapter => 'sqlite3', :database => ':memory:' }
6
+ TIME = (ENV["BENCHMARK_TIME"] || 20).to_i
7
+ RECORDS = (ENV["BENCHMARK_RECORDS"] || TIME * 1000).to_i
8
+
9
+ conn = { adapter: "sqlite3", database: ":memory:" }
7
10
 
8
11
  ActiveRecord::Base.establish_connection(conn)
9
12
 
10
13
  class User < ActiveRecord::Base
11
- connection.create_table :users, :force => true do |t|
14
+ connection.create_table :users, force: true do |t|
12
15
  t.string :name, :email
13
16
  t.timestamps
14
17
  end
@@ -17,7 +20,7 @@ class User < ActiveRecord::Base
17
20
  end
18
21
 
19
22
  class Exhibit < ActiveRecord::Base
20
- connection.create_table :exhibits, :force => true do |t|
23
+ connection.create_table :exhibits, force: true do |t|
21
24
  t.belongs_to :user
22
25
  t.string :name
23
26
  t.text :notes
@@ -37,28 +40,30 @@ class Exhibit < ActiveRecord::Base
37
40
  where("notes IS NOT NULL")
38
41
  end
39
42
 
40
- def self.look(exhibits) exhibits.each { |e| e.look } end
41
- def self.feel(exhibits) exhibits.each { |e| e.feel } end
43
+ def self.look(exhibits) exhibits.each(&:look) end
44
+ def self.feel(exhibits) exhibits.each(&:feel) end
42
45
  end
43
46
 
44
- puts 'Generating data...'
47
+ def progress_bar(int); print "." if (int % 100).zero? ; end
48
+
49
+ puts "Generating data..."
45
50
 
46
51
  module ActiveRecord
47
52
  class Faker
48
- LOREM = %Q{Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse non aliquet diam. Curabitur vel urna metus, quis malesuada elit.
53
+ LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse non aliquet diam. Curabitur vel urna metus, quis malesuada elit.
49
54
  Integer consequat tincidunt felis. Etiam non erat dolor. Vivamus imperdiet nibh sit amet diam eleifend id posuere diam malesuada. Mauris at accumsan sem.
50
55
  Donec id lorem neque. Fusce erat lorem, ornare eu congue vitae, malesuada quis neque. Maecenas vel urna a velit pretium fermentum. Donec tortor enim,
51
56
  tempor venenatis egestas a, tempor sed ipsum. Ut arcu justo, faucibus non imperdiet ac, interdum at diam. Pellentesque ipsum enim, venenatis ut iaculis vitae,
52
57
  varius vitae sem. Sed rutrum quam ac elit euismod bibendum. Donec ultricies ultricies magna, at lacinia libero mollis aliquam. Sed ac arcu in tortor elementum
53
58
  tincidunt vel interdum sem. Curabitur eget erat arcu. Praesent eget eros leo. Nam magna enim, sollicitudin vehicula scelerisque in, vulputate ut libero.
54
- Praesent varius tincidunt commodo}.split
59
+ Praesent varius tincidunt commodo".split
55
60
 
56
61
  def self.name
57
- LOREM.grep(/^\w*$/).sort_by { rand }.first(2).join ' '
62
+ LOREM.grep(/^\w*$/).sort_by { rand }.first(2).join " "
58
63
  end
59
64
 
60
65
  def self.email
61
- LOREM.grep(/^\w*$/).sort_by { rand }.first(2).join('@') + ".com"
66
+ LOREM.grep(/^\w*$/).sort_by { rand }.first(2).join("@") + ".com"
62
67
  end
63
68
  end
64
69
  end
@@ -69,109 +74,112 @@ end
69
74
 
70
75
  # Using the same paragraph for all exhibits because it is very slow
71
76
  # to generate unique paragraphs for all exhibits.
72
- notes = ActiveRecord::Faker::LOREM.join ' '
77
+ notes = ActiveRecord::Faker::LOREM.join " "
73
78
  today = Date.today
74
79
 
75
- puts 'Inserting 10,000 users and exhibits...'
76
- 10_000.times do
80
+ puts "Inserting #{RECORDS} users and exhibits..."
81
+ RECORDS.times do |record|
77
82
  user = User.create(
78
- :created_at => today,
79
- :name => ActiveRecord::Faker.name,
80
- :email => ActiveRecord::Faker.email
83
+ created_at: today,
84
+ name: ActiveRecord::Faker.name,
85
+ email: ActiveRecord::Faker.email
81
86
  )
82
87
 
83
88
  Exhibit.create(
84
- :created_at => today,
85
- :name => ActiveRecord::Faker.name,
86
- :user => user,
87
- :notes => notes
89
+ created_at: today,
90
+ name: ActiveRecord::Faker.name,
91
+ user: user,
92
+ notes: notes
88
93
  )
94
+ progress_bar(record)
89
95
  end
96
+ puts "Done!\n"
90
97
 
91
- require 'benchmark'
92
-
93
- Benchmark.bm(46) do |x|
98
+ Benchmark.ips(TIME) do |x|
94
99
  ar_obj = Exhibit.find(1)
95
- attrs = { :name => 'sam' }
96
- attrs_first = { :name => 'sam' }
97
- attrs_second = { :name => 'tom' }
100
+ attrs = { name: "sam" }
101
+ attrs_first = { name: "sam" }
102
+ attrs_second = { name: "tom" }
98
103
  exhibit = {
99
- :name => ActiveRecord::Faker.name,
100
- :notes => notes,
101
- :created_at => Date.today
104
+ name: ActiveRecord::Faker.name,
105
+ notes: notes,
106
+ created_at: Date.today
102
107
  }
103
108
 
104
- x.report("Model#id (x#{(TIMES * 100).ceil})") do
105
- (TIMES * 100).ceil.times { ar_obj.id }
109
+ x.report("Model#id") do
110
+ ar_obj.id
111
+ end
112
+
113
+ x.report "Model.new (instantiation)" do
114
+ Exhibit.new
115
+ end
116
+
117
+ x.report "Model.new (setting attributes)" do
118
+ Exhibit.new(attrs)
106
119
  end
107
120
 
108
- x.report 'Model.new (instantiation)' do
109
- TIMES.times { Exhibit.new }
121
+ x.report "Model.first" do
122
+ Exhibit.first.look
110
123
  end
111
124
 
112
- x.report 'Model.new (setting attributes)' do
113
- TIMES.times { Exhibit.new(attrs) }
125
+ x.report "Model.take" do
126
+ Exhibit.take
114
127
  end
115
128
 
116
- x.report 'Model.first' do
117
- TIMES.times { Exhibit.first.look }
129
+ x.report("Model.all limit(100)") do
130
+ Exhibit.look Exhibit.limit(100)
118
131
  end
119
132
 
120
- x.report 'Model.named_scope' do
121
- TIMES.times { Exhibit.limit(10).with_name.with_notes }
133
+ x.report("Model.all take(100)") do
134
+ Exhibit.look Exhibit.take(100)
122
135
  end
123
136
 
124
- x.report("Model.all limit(100) (x#{(TIMES / 10).ceil})") do
125
- (TIMES / 10).ceil.times { Exhibit.look Exhibit.limit(100) }
137
+ x.report "Model.all limit(100) with relationship" do
138
+ Exhibit.feel Exhibit.limit(100).includes(:user)
126
139
  end
127
140
 
128
- x.report "Model.all limit(100) with relationship (x#{(TIMES / 10).ceil})" do
129
- (TIMES / 10).ceil.times { Exhibit.feel Exhibit.limit(100).includes(:user) }
141
+ x.report "Model.all limit(10,000)" do
142
+ Exhibit.look Exhibit.limit(10000)
130
143
  end
131
144
 
132
- x.report "Model.all limit(10,000) x(#{(TIMES / 1000).ceil})" do
133
- (TIMES / 1000).ceil.times { Exhibit.look Exhibit.limit(10000) }
145
+ x.report "Model.named_scope" do
146
+ Exhibit.limit(10).with_name.with_notes
134
147
  end
135
148
 
136
- x.report 'Model.create' do
137
- TIMES.times { Exhibit.create(exhibit) }
149
+ x.report "Model.create" do
150
+ Exhibit.create(exhibit)
138
151
  end
139
152
 
140
- x.report 'Resource#attributes=' do
141
- TIMES.times {
142
- exhibit = Exhibit.new(attrs_first)
143
- exhibit.attributes = attrs_second
144
- }
153
+ x.report "Resource#attributes=" do
154
+ e = Exhibit.new(attrs_first)
155
+ e.attributes = attrs_second
145
156
  end
146
157
 
147
- x.report 'Resource#update' do
148
- TIMES.times { Exhibit.first.update_attributes(:name => 'bob') }
158
+ x.report "Resource#update" do
159
+ Exhibit.first.update(name: "bob")
149
160
  end
150
161
 
151
- x.report 'Resource#destroy' do
152
- TIMES.times { Exhibit.first.destroy }
162
+ x.report "Resource#destroy" do
163
+ Exhibit.first.destroy
153
164
  end
154
165
 
155
- x.report 'Model.transaction' do
156
- TIMES.times { Exhibit.transaction { Exhibit.new } }
166
+ x.report "Model.transaction" do
167
+ Exhibit.transaction { Exhibit.new }
157
168
  end
158
169
 
159
- x.report 'Model.find(id)' do
160
- id = Exhibit.first.id
161
- TIMES.times { Exhibit.find(id) }
170
+ x.report "Model.find(id)" do
171
+ User.find(1)
162
172
  end
163
173
 
164
- x.report 'Model.find_by_sql' do
165
- TIMES.times {
166
- Exhibit.find_by_sql("SELECT * FROM exhibits WHERE id = #{(rand * 1000 + 1).to_i}").first
167
- }
174
+ x.report "Model.find_by_sql" do
175
+ Exhibit.find_by_sql("SELECT * FROM exhibits WHERE id = #{(rand * 1000 + 1).to_i}").first
168
176
  end
169
177
 
170
- x.report "Model.log x(#{TIMES * 10})" do
171
- (TIMES * 10).times { Exhibit.connection.send(:log, "hello", "world") {} }
178
+ x.report "Model.log" do
179
+ Exhibit.connection.send(:log, "hello", "world") { }
172
180
  end
173
181
 
174
- x.report "AR.execute(query) (#{TIMES / 2})" do
175
- (TIMES / 2).times { ActiveRecord::Base.connection.execute("Select * from exhibits where id = #{(rand * 1000 + 1).to_i}") }
182
+ x.report "AR.execute(query)" do
183
+ ActiveRecord::Base.connection.execute("SELECT * FROM exhibits WHERE id = #{(rand * 1000 + 1).to_i}")
176
184
  end
177
185
  end
data/examples/simple.rb CHANGED
@@ -1,14 +1,15 @@
1
- $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
2
- require 'active_record'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
3
4
 
4
5
  class Person < ActiveRecord::Base
5
- establish_connection :adapter => 'sqlite3', :database => 'foobar.db'
6
- connection.create_table table_name, :force => true do |t|
6
+ establish_connection adapter: "sqlite3", database: "foobar.db"
7
+ connection.create_table table_name, force: true do |t|
7
8
  t.string :name
8
9
  end
9
10
  end
10
11
 
11
- bob = Person.create!(:name => 'bob')
12
+ bob = Person.create!(name: "bob")
12
13
  puts Person.all.inspect
13
14
  bob.destroy
14
15
  puts Person.all.inspect