activerecord 6.0.1

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 (340) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1086 -0
  3. data/MIT-LICENSE +22 -0
  4. data/README.rdoc +219 -0
  5. data/examples/performance.rb +185 -0
  6. data/examples/simple.rb +15 -0
  7. data/lib/active_record.rb +195 -0
  8. data/lib/active_record/aggregations.rb +285 -0
  9. data/lib/active_record/association_relation.rb +49 -0
  10. data/lib/active_record/associations.rb +1865 -0
  11. data/lib/active_record/associations/alias_tracker.rb +81 -0
  12. data/lib/active_record/associations/association.rb +340 -0
  13. data/lib/active_record/associations/association_scope.rb +166 -0
  14. data/lib/active_record/associations/belongs_to_association.rb +124 -0
  15. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +36 -0
  16. data/lib/active_record/associations/builder/association.rb +136 -0
  17. data/lib/active_record/associations/builder/belongs_to.rb +130 -0
  18. data/lib/active_record/associations/builder/collection_association.rb +72 -0
  19. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +114 -0
  20. data/lib/active_record/associations/builder/has_many.rb +19 -0
  21. data/lib/active_record/associations/builder/has_one.rb +64 -0
  22. data/lib/active_record/associations/builder/singular_association.rb +44 -0
  23. data/lib/active_record/associations/collection_association.rb +498 -0
  24. data/lib/active_record/associations/collection_proxy.rb +1128 -0
  25. data/lib/active_record/associations/foreign_association.rb +20 -0
  26. data/lib/active_record/associations/has_many_association.rb +136 -0
  27. data/lib/active_record/associations/has_many_through_association.rb +220 -0
  28. data/lib/active_record/associations/has_one_association.rb +118 -0
  29. data/lib/active_record/associations/has_one_through_association.rb +45 -0
  30. data/lib/active_record/associations/join_dependency.rb +262 -0
  31. data/lib/active_record/associations/join_dependency/join_association.rb +80 -0
  32. data/lib/active_record/associations/join_dependency/join_base.rb +23 -0
  33. data/lib/active_record/associations/join_dependency/join_part.rb +71 -0
  34. data/lib/active_record/associations/preloader.rb +201 -0
  35. data/lib/active_record/associations/preloader/association.rb +133 -0
  36. data/lib/active_record/associations/preloader/through_association.rb +116 -0
  37. data/lib/active_record/associations/singular_association.rb +59 -0
  38. data/lib/active_record/associations/through_association.rb +121 -0
  39. data/lib/active_record/attribute_assignment.rb +85 -0
  40. data/lib/active_record/attribute_decorators.rb +90 -0
  41. data/lib/active_record/attribute_methods.rb +420 -0
  42. data/lib/active_record/attribute_methods/before_type_cast.rb +81 -0
  43. data/lib/active_record/attribute_methods/dirty.rb +221 -0
  44. data/lib/active_record/attribute_methods/primary_key.rb +136 -0
  45. data/lib/active_record/attribute_methods/query.rb +41 -0
  46. data/lib/active_record/attribute_methods/read.rb +47 -0
  47. data/lib/active_record/attribute_methods/serialization.rb +90 -0
  48. data/lib/active_record/attribute_methods/time_zone_conversion.rb +91 -0
  49. data/lib/active_record/attribute_methods/write.rb +61 -0
  50. data/lib/active_record/attributes.rb +279 -0
  51. data/lib/active_record/autosave_association.rb +512 -0
  52. data/lib/active_record/base.rb +328 -0
  53. data/lib/active_record/callbacks.rb +339 -0
  54. data/lib/active_record/coders/json.rb +15 -0
  55. data/lib/active_record/coders/yaml_column.rb +50 -0
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +1175 -0
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +85 -0
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +516 -0
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +155 -0
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +251 -0
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +23 -0
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -0
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +713 -0
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +93 -0
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1475 -0
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +323 -0
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +772 -0
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +830 -0
  69. data/lib/active_record/connection_adapters/column.rb +95 -0
  70. data/lib/active_record/connection_adapters/connection_specification.rb +297 -0
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +202 -0
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +72 -0
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +72 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +146 -0
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +30 -0
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +184 -0
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid.rb +34 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +92 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +53 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +15 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +17 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +50 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +23 -0
  93. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +15 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +21 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +71 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +15 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +15 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +41 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +15 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +65 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +97 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +18 -0
  104. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +113 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +26 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +28 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +30 -0
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +205 -0
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +43 -0
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +222 -0
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +50 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +776 -0
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +81 -0
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +953 -0
  117. data/lib/active_record/connection_adapters/schema_cache.rb +141 -0
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  119. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +120 -0
  120. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +103 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  126. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +561 -0
  127. data/lib/active_record/connection_adapters/statement_pool.rb +61 -0
  128. data/lib/active_record/connection_handling.rb +274 -0
  129. data/lib/active_record/core.rb +603 -0
  130. data/lib/active_record/counter_cache.rb +193 -0
  131. data/lib/active_record/database_configurations.rb +233 -0
  132. data/lib/active_record/database_configurations/database_config.rb +37 -0
  133. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  134. data/lib/active_record/database_configurations/url_config.rb +79 -0
  135. data/lib/active_record/define_callbacks.rb +22 -0
  136. data/lib/active_record/dynamic_matchers.rb +122 -0
  137. data/lib/active_record/enum.rb +274 -0
  138. data/lib/active_record/errors.rb +388 -0
  139. data/lib/active_record/explain.rb +50 -0
  140. data/lib/active_record/explain_registry.rb +32 -0
  141. data/lib/active_record/explain_subscriber.rb +34 -0
  142. data/lib/active_record/fixture_set/file.rb +82 -0
  143. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  144. data/lib/active_record/fixture_set/render_context.rb +17 -0
  145. data/lib/active_record/fixture_set/table_row.rb +153 -0
  146. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  147. data/lib/active_record/fixtures.rb +738 -0
  148. data/lib/active_record/gem_version.rb +17 -0
  149. data/lib/active_record/inheritance.rb +293 -0
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +207 -0
  152. data/lib/active_record/internal_metadata.rb +53 -0
  153. data/lib/active_record/legacy_yaml_adapter.rb +48 -0
  154. data/lib/active_record/locale/en.yml +48 -0
  155. data/lib/active_record/locking/optimistic.rb +197 -0
  156. data/lib/active_record/locking/pessimistic.rb +89 -0
  157. data/lib/active_record/log_subscriber.rb +118 -0
  158. data/lib/active_record/middleware/database_selector.rb +75 -0
  159. data/lib/active_record/middleware/database_selector/resolver.rb +88 -0
  160. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  161. data/lib/active_record/migration.rb +1397 -0
  162. data/lib/active_record/migration/command_recorder.rb +284 -0
  163. data/lib/active_record/migration/compatibility.rb +244 -0
  164. data/lib/active_record/migration/join_table.rb +17 -0
  165. data/lib/active_record/model_schema.rb +545 -0
  166. data/lib/active_record/nested_attributes.rb +600 -0
  167. data/lib/active_record/no_touching.rb +65 -0
  168. data/lib/active_record/null_relation.rb +68 -0
  169. data/lib/active_record/persistence.rb +967 -0
  170. data/lib/active_record/query_cache.rb +52 -0
  171. data/lib/active_record/querying.rb +82 -0
  172. data/lib/active_record/railtie.rb +263 -0
  173. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  174. data/lib/active_record/railties/console_sandbox.rb +7 -0
  175. data/lib/active_record/railties/controller_runtime.rb +51 -0
  176. data/lib/active_record/railties/databases.rake +527 -0
  177. data/lib/active_record/readonly_attributes.rb +24 -0
  178. data/lib/active_record/reflection.rb +1042 -0
  179. data/lib/active_record/relation.rb +860 -0
  180. data/lib/active_record/relation/batches.rb +290 -0
  181. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  182. data/lib/active_record/relation/calculations.rb +424 -0
  183. data/lib/active_record/relation/delegation.rb +130 -0
  184. data/lib/active_record/relation/finder_methods.rb +561 -0
  185. data/lib/active_record/relation/from_clause.rb +26 -0
  186. data/lib/active_record/relation/merger.rb +184 -0
  187. data/lib/active_record/relation/predicate_builder.rb +150 -0
  188. data/lib/active_record/relation/predicate_builder/array_handler.rb +49 -0
  189. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  190. data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
  191. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  192. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  193. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  194. data/lib/active_record/relation/predicate_builder/relation_handler.rb +19 -0
  195. data/lib/active_record/relation/query_attribute.rb +50 -0
  196. data/lib/active_record/relation/query_methods.rb +1371 -0
  197. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  198. data/lib/active_record/relation/spawn_methods.rb +77 -0
  199. data/lib/active_record/relation/where_clause.rb +190 -0
  200. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  201. data/lib/active_record/result.rb +168 -0
  202. data/lib/active_record/runtime_registry.rb +24 -0
  203. data/lib/active_record/sanitization.rb +214 -0
  204. data/lib/active_record/schema.rb +61 -0
  205. data/lib/active_record/schema_dumper.rb +270 -0
  206. data/lib/active_record/schema_migration.rb +60 -0
  207. data/lib/active_record/scoping.rb +106 -0
  208. data/lib/active_record/scoping/default.rb +151 -0
  209. data/lib/active_record/scoping/named.rb +217 -0
  210. data/lib/active_record/secure_token.rb +40 -0
  211. data/lib/active_record/serialization.rb +22 -0
  212. data/lib/active_record/statement_cache.rb +148 -0
  213. data/lib/active_record/store.rb +290 -0
  214. data/lib/active_record/suppressor.rb +61 -0
  215. data/lib/active_record/table_metadata.rb +75 -0
  216. data/lib/active_record/tasks/database_tasks.rb +506 -0
  217. data/lib/active_record/tasks/mysql_database_tasks.rb +115 -0
  218. data/lib/active_record/tasks/postgresql_database_tasks.rb +141 -0
  219. data/lib/active_record/tasks/sqlite_database_tasks.rb +77 -0
  220. data/lib/active_record/test_databases.rb +23 -0
  221. data/lib/active_record/test_fixtures.rb +224 -0
  222. data/lib/active_record/timestamp.rb +167 -0
  223. data/lib/active_record/touch_later.rb +66 -0
  224. data/lib/active_record/transactions.rb +493 -0
  225. data/lib/active_record/translation.rb +24 -0
  226. data/lib/active_record/type.rb +78 -0
  227. data/lib/active_record/type/adapter_specific_registry.rb +129 -0
  228. data/lib/active_record/type/date.rb +9 -0
  229. data/lib/active_record/type/date_time.rb +9 -0
  230. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  231. data/lib/active_record/type/hash_lookup_type_map.rb +25 -0
  232. data/lib/active_record/type/internal/timezone.rb +17 -0
  233. data/lib/active_record/type/json.rb +30 -0
  234. data/lib/active_record/type/serialized.rb +71 -0
  235. data/lib/active_record/type/text.rb +11 -0
  236. data/lib/active_record/type/time.rb +21 -0
  237. data/lib/active_record/type/type_map.rb +62 -0
  238. data/lib/active_record/type/unsigned_integer.rb +17 -0
  239. data/lib/active_record/type_caster.rb +9 -0
  240. data/lib/active_record/type_caster/connection.rb +34 -0
  241. data/lib/active_record/type_caster/map.rb +20 -0
  242. data/lib/active_record/validations.rb +94 -0
  243. data/lib/active_record/validations/absence.rb +25 -0
  244. data/lib/active_record/validations/associated.rb +60 -0
  245. data/lib/active_record/validations/length.rb +26 -0
  246. data/lib/active_record/validations/presence.rb +68 -0
  247. data/lib/active_record/validations/uniqueness.rb +226 -0
  248. data/lib/active_record/version.rb +10 -0
  249. data/lib/arel.rb +58 -0
  250. data/lib/arel/alias_predication.rb +9 -0
  251. data/lib/arel/attributes.rb +22 -0
  252. data/lib/arel/attributes/attribute.rb +37 -0
  253. data/lib/arel/collectors/bind.rb +24 -0
  254. data/lib/arel/collectors/composite.rb +31 -0
  255. data/lib/arel/collectors/plain_string.rb +20 -0
  256. data/lib/arel/collectors/sql_string.rb +20 -0
  257. data/lib/arel/collectors/substitute_binds.rb +28 -0
  258. data/lib/arel/crud.rb +42 -0
  259. data/lib/arel/delete_manager.rb +18 -0
  260. data/lib/arel/errors.rb +9 -0
  261. data/lib/arel/expressions.rb +29 -0
  262. data/lib/arel/factory_methods.rb +49 -0
  263. data/lib/arel/insert_manager.rb +49 -0
  264. data/lib/arel/math.rb +45 -0
  265. data/lib/arel/nodes.rb +68 -0
  266. data/lib/arel/nodes/and.rb +32 -0
  267. data/lib/arel/nodes/ascending.rb +23 -0
  268. data/lib/arel/nodes/binary.rb +52 -0
  269. data/lib/arel/nodes/bind_param.rb +36 -0
  270. data/lib/arel/nodes/case.rb +55 -0
  271. data/lib/arel/nodes/casted.rb +50 -0
  272. data/lib/arel/nodes/comment.rb +29 -0
  273. data/lib/arel/nodes/count.rb +12 -0
  274. data/lib/arel/nodes/delete_statement.rb +45 -0
  275. data/lib/arel/nodes/descending.rb +23 -0
  276. data/lib/arel/nodes/equality.rb +18 -0
  277. data/lib/arel/nodes/extract.rb +24 -0
  278. data/lib/arel/nodes/false.rb +16 -0
  279. data/lib/arel/nodes/full_outer_join.rb +8 -0
  280. data/lib/arel/nodes/function.rb +44 -0
  281. data/lib/arel/nodes/grouping.rb +8 -0
  282. data/lib/arel/nodes/in.rb +8 -0
  283. data/lib/arel/nodes/infix_operation.rb +80 -0
  284. data/lib/arel/nodes/inner_join.rb +8 -0
  285. data/lib/arel/nodes/insert_statement.rb +37 -0
  286. data/lib/arel/nodes/join_source.rb +20 -0
  287. data/lib/arel/nodes/matches.rb +18 -0
  288. data/lib/arel/nodes/named_function.rb +23 -0
  289. data/lib/arel/nodes/node.rb +50 -0
  290. data/lib/arel/nodes/node_expression.rb +13 -0
  291. data/lib/arel/nodes/outer_join.rb +8 -0
  292. data/lib/arel/nodes/over.rb +15 -0
  293. data/lib/arel/nodes/regexp.rb +16 -0
  294. data/lib/arel/nodes/right_outer_join.rb +8 -0
  295. data/lib/arel/nodes/select_core.rb +67 -0
  296. data/lib/arel/nodes/select_statement.rb +41 -0
  297. data/lib/arel/nodes/sql_literal.rb +16 -0
  298. data/lib/arel/nodes/string_join.rb +11 -0
  299. data/lib/arel/nodes/table_alias.rb +27 -0
  300. data/lib/arel/nodes/terminal.rb +16 -0
  301. data/lib/arel/nodes/true.rb +16 -0
  302. data/lib/arel/nodes/unary.rb +45 -0
  303. data/lib/arel/nodes/unary_operation.rb +20 -0
  304. data/lib/arel/nodes/unqualified_column.rb +22 -0
  305. data/lib/arel/nodes/update_statement.rb +41 -0
  306. data/lib/arel/nodes/values_list.rb +9 -0
  307. data/lib/arel/nodes/window.rb +126 -0
  308. data/lib/arel/nodes/with.rb +11 -0
  309. data/lib/arel/order_predications.rb +13 -0
  310. data/lib/arel/predications.rb +257 -0
  311. data/lib/arel/select_manager.rb +271 -0
  312. data/lib/arel/table.rb +110 -0
  313. data/lib/arel/tree_manager.rb +72 -0
  314. data/lib/arel/update_manager.rb +34 -0
  315. data/lib/arel/visitors.rb +20 -0
  316. data/lib/arel/visitors/depth_first.rb +204 -0
  317. data/lib/arel/visitors/dot.rb +297 -0
  318. data/lib/arel/visitors/ibm_db.rb +34 -0
  319. data/lib/arel/visitors/informix.rb +62 -0
  320. data/lib/arel/visitors/mssql.rb +157 -0
  321. data/lib/arel/visitors/mysql.rb +83 -0
  322. data/lib/arel/visitors/oracle.rb +159 -0
  323. data/lib/arel/visitors/oracle12.rb +66 -0
  324. data/lib/arel/visitors/postgresql.rb +110 -0
  325. data/lib/arel/visitors/sqlite.rb +39 -0
  326. data/lib/arel/visitors/to_sql.rb +889 -0
  327. data/lib/arel/visitors/visitor.rb +46 -0
  328. data/lib/arel/visitors/where_sql.rb +23 -0
  329. data/lib/arel/window_predications.rb +9 -0
  330. data/lib/rails/generators/active_record.rb +19 -0
  331. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  332. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  333. data/lib/rails/generators/active_record/migration.rb +48 -0
  334. data/lib/rails/generators/active_record/migration/migration_generator.rb +75 -0
  335. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  336. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +48 -0
  337. data/lib/rails/generators/active_record/model/model_generator.rb +49 -0
  338. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  339. data/lib/rails/generators/active_record/model/templates/module.rb.tt +7 -0
  340. metadata +418 -0
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2004-2019 David Heinemeier Hansson
2
+
3
+ Arel originally copyright (c) 2007-2016 Nick Kallen, Bryan Helmkamp, Emilio Tagua, Aaron Patterson
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,219 @@
1
+ = Active Record -- Object-relational mapping in Rails
2
+
3
+ Active Record connects classes to relational database tables to establish an
4
+ almost zero-configuration persistence layer for applications. The library
5
+ provides a base class that, when subclassed, sets up a mapping between the new
6
+ class and an existing table in the database. In the context of an application,
7
+ these classes are commonly referred to as *models*. Models can also be
8
+ connected to other models; this is done by defining *associations*.
9
+
10
+ Active Record relies heavily on naming in that it uses class and association
11
+ names to establish mappings between respective database tables and foreign key
12
+ columns. Although these mappings can be defined explicitly, it's recommended
13
+ to follow naming conventions, especially when getting started with the
14
+ library.
15
+
16
+ You can read more about Active Record in the {Active Record Basics}[https://edgeguides.rubyonrails.org/active_record_basics.html] guide.
17
+
18
+ A short rundown of some of the major features:
19
+
20
+ * Automated mapping between classes and tables, attributes and columns.
21
+
22
+ class Product < ActiveRecord::Base
23
+ end
24
+
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:
29
+
30
+ CREATE TABLE products (
31
+ id bigint NOT NULL auto_increment,
32
+ name varchar(255),
33
+ PRIMARY KEY (id)
34
+ );
35
+
36
+ This would also define the following accessors: <tt>Product#name</tt> and
37
+ <tt>Product#name=(new_name)</tt>.
38
+
39
+
40
+ * Associations between objects defined by simple class methods.
41
+
42
+ class Firm < ActiveRecord::Base
43
+ has_many :clients
44
+ has_one :account
45
+ belongs_to :conglomerate
46
+ end
47
+
48
+ {Learn more}[link:classes/ActiveRecord/Associations/ClassMethods.html]
49
+
50
+
51
+ * Aggregations of value objects.
52
+
53
+ class Account < ActiveRecord::Base
54
+ composed_of :balance, class_name: 'Money',
55
+ mapping: %w(balance amount)
56
+ composed_of :address,
57
+ mapping: [%w(address_street street), %w(address_city city)]
58
+ end
59
+
60
+ {Learn more}[link:classes/ActiveRecord/Aggregations/ClassMethods.html]
61
+
62
+
63
+ * Validation rules that can differ for new or existing objects.
64
+
65
+ class Account < ActiveRecord::Base
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
70
+ end
71
+
72
+ {Learn more}[link:classes/ActiveRecord/Validations.html]
73
+
74
+
75
+ * Callbacks available for the entire life cycle (instantiation, saving, destroying, validating, etc.).
76
+
77
+ class Person < ActiveRecord::Base
78
+ before_destroy :invalidate_payment_plan
79
+ # the `invalidate_payment_plan` method gets called just before Person#destroy
80
+ end
81
+
82
+ {Learn more}[link:classes/ActiveRecord/Callbacks.html]
83
+
84
+
85
+ * Inheritance hierarchies.
86
+
87
+ class Company < ActiveRecord::Base; end
88
+ class Firm < Company; end
89
+ class Client < Company; end
90
+ class PriorityClient < Client; end
91
+
92
+ {Learn more}[link:classes/ActiveRecord/Base.html]
93
+
94
+
95
+ * Transactions.
96
+
97
+ # Database transaction
98
+ Account.transaction do
99
+ david.withdrawal(100)
100
+ mary.deposit(100)
101
+ end
102
+
103
+ {Learn more}[link:classes/ActiveRecord/Transactions/ClassMethods.html]
104
+
105
+
106
+ * Reflections on columns, associations, and aggregations.
107
+
108
+ reflection = Firm.reflect_on_association(:clients)
109
+ reflection.klass # => Client (class)
110
+ Firm.columns # Returns an array of column descriptors for the firms table
111
+
112
+ {Learn more}[link:classes/ActiveRecord/Reflection/ClassMethods.html]
113
+
114
+
115
+ * Database abstraction through simple adapters.
116
+
117
+ # connect to SQLite3
118
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'dbfile.sqlite3')
119
+
120
+ # connect to MySQL with authentication
121
+ ActiveRecord::Base.establish_connection(
122
+ adapter: 'mysql2',
123
+ host: 'localhost',
124
+ username: 'me',
125
+ password: 'secret',
126
+ database: 'activerecord'
127
+ )
128
+
129
+ {Learn more}[link:classes/ActiveRecord/Base.html] and read about the built-in support for
130
+ MySQL[link:classes/ActiveRecord/ConnectionAdapters/Mysql2Adapter.html],
131
+ PostgreSQL[link:classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html], and
132
+ SQLite3[link:classes/ActiveRecord/ConnectionAdapters/SQLite3Adapter.html].
133
+
134
+
135
+ * Logging support for Log4r[https://github.com/colbygk/log4r] and Logger[http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc].
136
+
137
+ ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT)
138
+ ActiveRecord::Base.logger = Log4r::Logger.new('Application Log')
139
+
140
+
141
+ * Database agnostic schema management with Migrations.
142
+
143
+ class AddSystemSettings < ActiveRecord::Migration[5.0]
144
+ def up
145
+ create_table :system_settings do |t|
146
+ t.string :name
147
+ t.string :label
148
+ t.text :value
149
+ t.string :type
150
+ t.integer :position
151
+ end
152
+
153
+ SystemSetting.create name: 'notice', label: 'Use notice?', value: 1
154
+ end
155
+
156
+ def down
157
+ drop_table :system_settings
158
+ end
159
+ end
160
+
161
+ {Learn more}[link:classes/ActiveRecord/Migration.html]
162
+
163
+
164
+ == Philosophy
165
+
166
+ Active Record is an implementation of the object-relational mapping (ORM)
167
+ pattern[https://www.martinfowler.com/eaaCatalog/activeRecord.html] by the same
168
+ name described by Martin Fowler:
169
+
170
+ "An object that wraps a row in a database table or view,
171
+ encapsulates the database access, and adds domain logic on that data."
172
+
173
+ Active Record attempts to provide a coherent wrapper as a solution for the inconvenience that is
174
+ object-relational mapping. The prime directive for this mapping has been to minimize
175
+ the amount of code needed to build a real-world domain model. This is made possible
176
+ by relying on a number of conventions that make it easy for Active Record to infer
177
+ complex relations and structures from a minimal amount of explicit direction.
178
+
179
+ Convention over Configuration:
180
+ * No XML files!
181
+ * Lots of reflection and run-time extension
182
+ * Magic is not inherently a bad word
183
+
184
+ Admit the Database:
185
+ * Lets you drop down to SQL for odd cases and performance
186
+ * Doesn't attempt to duplicate or replace data definitions
187
+
188
+
189
+ == Download and installation
190
+
191
+ The latest version of Active Record can be installed with RubyGems:
192
+
193
+ $ gem install activerecord
194
+
195
+ Source code can be downloaded as part of the Rails project on GitHub:
196
+
197
+ * https://github.com/rails/rails/tree/master/activerecord
198
+
199
+
200
+ == License
201
+
202
+ Active Record is released under the MIT license:
203
+
204
+ * https://opensource.org/licenses/MIT
205
+
206
+
207
+ == Support
208
+
209
+ API documentation is at:
210
+
211
+ * https://api.rubyonrails.org
212
+
213
+ Bug reports for the Ruby on Rails project can be filed here:
214
+
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
@@ -0,0 +1,185 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "benchmark/ips"
5
+
6
+ TIME = (ENV["BENCHMARK_TIME"] || 20).to_i
7
+ RECORDS = (ENV["BENCHMARK_RECORDS"] || TIME * 1000).to_i
8
+
9
+ conn = { adapter: "sqlite3", database: ":memory:" }
10
+
11
+ ActiveRecord::Base.establish_connection(conn)
12
+
13
+ class User < ActiveRecord::Base
14
+ connection.create_table :users, force: true do |t|
15
+ t.string :name, :email
16
+ t.timestamps
17
+ end
18
+
19
+ has_many :exhibits
20
+ end
21
+
22
+ class Exhibit < ActiveRecord::Base
23
+ connection.create_table :exhibits, force: true do |t|
24
+ t.belongs_to :user
25
+ t.string :name
26
+ t.text :notes
27
+ t.timestamps
28
+ end
29
+
30
+ belongs_to :user
31
+
32
+ def look; attributes end
33
+ def feel; look; user.name end
34
+
35
+ def self.with_name
36
+ where("name IS NOT NULL")
37
+ end
38
+
39
+ def self.with_notes
40
+ where("notes IS NOT NULL")
41
+ end
42
+
43
+ def self.look(exhibits) exhibits.each(&:look) end
44
+ def self.feel(exhibits) exhibits.each(&:feel) end
45
+ end
46
+
47
+ def progress_bar(int); print "." if (int % 100).zero? ; end
48
+
49
+ puts "Generating data..."
50
+
51
+ module ActiveRecord
52
+ class Faker
53
+ LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse non aliquet diam. Curabitur vel urna metus, quis malesuada elit.
54
+ Integer consequat tincidunt felis. Etiam non erat dolor. Vivamus imperdiet nibh sit amet diam eleifend id posuere diam malesuada. Mauris at accumsan sem.
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,
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,
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
58
+ tincidunt vel interdum sem. Curabitur eget erat arcu. Praesent eget eros leo. Nam magna enim, sollicitudin vehicula scelerisque in, vulputate ut libero.
59
+ Praesent varius tincidunt commodo".split
60
+
61
+ def self.name
62
+ LOREM.grep(/^\w*$/).sort_by { rand }.first(2).join " "
63
+ end
64
+
65
+ def self.email
66
+ LOREM.grep(/^\w*$/).sort_by { rand }.first(2).join("@") + ".com"
67
+ end
68
+ end
69
+ end
70
+
71
+ # pre-compute the insert statements and fake data compilation,
72
+ # so the benchmarks below show the actual runtime for the execute
73
+ # method, minus the setup steps
74
+
75
+ # Using the same paragraph for all exhibits because it is very slow
76
+ # to generate unique paragraphs for all exhibits.
77
+ notes = ActiveRecord::Faker::LOREM.join " "
78
+ today = Date.today
79
+
80
+ puts "Inserting #{RECORDS} users and exhibits..."
81
+ RECORDS.times do |record|
82
+ user = User.create(
83
+ created_at: today,
84
+ name: ActiveRecord::Faker.name,
85
+ email: ActiveRecord::Faker.email
86
+ )
87
+
88
+ Exhibit.create(
89
+ created_at: today,
90
+ name: ActiveRecord::Faker.name,
91
+ user: user,
92
+ notes: notes
93
+ )
94
+ progress_bar(record)
95
+ end
96
+ puts "Done!\n"
97
+
98
+ Benchmark.ips(TIME) do |x|
99
+ ar_obj = Exhibit.find(1)
100
+ attrs = { name: "sam" }
101
+ attrs_first = { name: "sam" }
102
+ attrs_second = { name: "tom" }
103
+ exhibit = {
104
+ name: ActiveRecord::Faker.name,
105
+ notes: notes,
106
+ created_at: Date.today
107
+ }
108
+
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)
119
+ end
120
+
121
+ x.report "Model.first" do
122
+ Exhibit.first.look
123
+ end
124
+
125
+ x.report "Model.take" do
126
+ Exhibit.take
127
+ end
128
+
129
+ x.report("Model.all limit(100)") do
130
+ Exhibit.look Exhibit.limit(100)
131
+ end
132
+
133
+ x.report("Model.all take(100)") do
134
+ Exhibit.look Exhibit.take(100)
135
+ end
136
+
137
+ x.report "Model.all limit(100) with relationship" do
138
+ Exhibit.feel Exhibit.limit(100).includes(:user)
139
+ end
140
+
141
+ x.report "Model.all limit(10,000)" do
142
+ Exhibit.look Exhibit.limit(10000)
143
+ end
144
+
145
+ x.report "Model.named_scope" do
146
+ Exhibit.limit(10).with_name.with_notes
147
+ end
148
+
149
+ x.report "Model.create" do
150
+ Exhibit.create(exhibit)
151
+ end
152
+
153
+ x.report "Resource#attributes=" do
154
+ e = Exhibit.new(attrs_first)
155
+ e.attributes = attrs_second
156
+ end
157
+
158
+ x.report "Resource#update" do
159
+ Exhibit.first.update(name: "bob")
160
+ end
161
+
162
+ x.report "Resource#destroy" do
163
+ Exhibit.first.destroy
164
+ end
165
+
166
+ x.report "Model.transaction" do
167
+ Exhibit.transaction { Exhibit.new }
168
+ end
169
+
170
+ x.report "Model.find(id)" do
171
+ User.find(1)
172
+ end
173
+
174
+ x.report "Model.find_by_sql" do
175
+ Exhibit.find_by_sql("SELECT * FROM exhibits WHERE id = #{(rand * 1000 + 1).to_i}").first
176
+ end
177
+
178
+ x.report "Model.log" do
179
+ Exhibit.connection.send(:log, "hello", "world") { }
180
+ end
181
+
182
+ x.report "AR.execute(query)" do
183
+ ActiveRecord::Base.connection.execute("SELECT * FROM exhibits WHERE id = #{(rand * 1000 + 1).to_i}")
184
+ end
185
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+
5
+ class Person < ActiveRecord::Base
6
+ establish_connection adapter: "sqlite3", database: "foobar.db"
7
+ connection.create_table table_name, force: true do |t|
8
+ t.string :name
9
+ end
10
+ end
11
+
12
+ bob = Person.create!(name: "bob")
13
+ puts Person.all.inspect
14
+ bob.destroy
15
+ puts Person.all.inspect
@@ -0,0 +1,195 @@
1
+ # frozen_string_literal: true
2
+
3
+ #--
4
+ # Copyright (c) 2004-2019 David Heinemeier Hansson
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining
7
+ # a copy of this software and associated documentation files (the
8
+ # "Software"), to deal in the Software without restriction, including
9
+ # without limitation the rights to use, copy, modify, merge, publish,
10
+ # distribute, sublicense, and/or sell copies of the Software, and to
11
+ # permit persons to whom the Software is furnished to do so, subject to
12
+ # the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be
15
+ # included in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+ #++
25
+
26
+ require "active_support"
27
+ require "active_support/rails"
28
+ require "active_model"
29
+ require "arel"
30
+ require "yaml"
31
+
32
+ require "active_record/version"
33
+ require "active_model/attribute_set"
34
+
35
+ module ActiveRecord
36
+ extend ActiveSupport::Autoload
37
+
38
+ autoload :Base
39
+ autoload :Callbacks
40
+ autoload :Core
41
+ autoload :ConnectionHandling
42
+ autoload :CounterCache
43
+ autoload :DynamicMatchers
44
+ autoload :Enum
45
+ autoload :InternalMetadata
46
+ autoload :Explain
47
+ autoload :Inheritance
48
+ autoload :Integration
49
+ autoload :Migration
50
+ autoload :Migrator, "active_record/migration"
51
+ autoload :ModelSchema
52
+ autoload :NestedAttributes
53
+ autoload :NoTouching
54
+ autoload :TouchLater
55
+ autoload :Persistence
56
+ autoload :QueryCache
57
+ autoload :Querying
58
+ autoload :ReadonlyAttributes
59
+ autoload :RecordInvalid, "active_record/validations"
60
+ autoload :Reflection
61
+ autoload :RuntimeRegistry
62
+ autoload :Sanitization
63
+ autoload :Schema
64
+ autoload :SchemaDumper
65
+ autoload :SchemaMigration
66
+ autoload :Scoping
67
+ autoload :Serialization
68
+ autoload :StatementCache
69
+ autoload :Store
70
+ autoload :Suppressor
71
+ autoload :Timestamp
72
+ autoload :Transactions
73
+ autoload :Translation
74
+ autoload :Validations
75
+ autoload :SecureToken
76
+ autoload :DatabaseSelector, "active_record/middleware/database_selector"
77
+
78
+ eager_autoload do
79
+ autoload :ActiveRecordError, "active_record/errors"
80
+ autoload :ConnectionNotEstablished, "active_record/errors"
81
+ autoload :ConnectionAdapters, "active_record/connection_adapters/abstract_adapter"
82
+
83
+ autoload :Aggregations
84
+ autoload :Associations
85
+ autoload :AttributeAssignment
86
+ autoload :AttributeMethods
87
+ autoload :AutosaveAssociation
88
+
89
+ autoload :LegacyYamlAdapter
90
+
91
+ autoload :Relation
92
+ autoload :AssociationRelation
93
+ autoload :NullRelation
94
+
95
+ autoload_under "relation" do
96
+ autoload :QueryMethods
97
+ autoload :FinderMethods
98
+ autoload :Calculations
99
+ autoload :PredicateBuilder
100
+ autoload :SpawnMethods
101
+ autoload :Batches
102
+ autoload :Delegation
103
+ end
104
+
105
+ autoload :Result
106
+ autoload :TableMetadata
107
+ autoload :Type
108
+ end
109
+
110
+ module Coders
111
+ autoload :YAMLColumn, "active_record/coders/yaml_column"
112
+ autoload :JSON, "active_record/coders/json"
113
+ end
114
+
115
+ module AttributeMethods
116
+ extend ActiveSupport::Autoload
117
+
118
+ eager_autoload do
119
+ autoload :BeforeTypeCast
120
+ autoload :Dirty
121
+ autoload :PrimaryKey
122
+ autoload :Query
123
+ autoload :Read
124
+ autoload :TimeZoneConversion
125
+ autoload :Write
126
+ autoload :Serialization
127
+ end
128
+ end
129
+
130
+ module Locking
131
+ extend ActiveSupport::Autoload
132
+
133
+ eager_autoload do
134
+ autoload :Optimistic
135
+ autoload :Pessimistic
136
+ end
137
+ end
138
+
139
+ module ConnectionAdapters
140
+ extend ActiveSupport::Autoload
141
+
142
+ eager_autoload do
143
+ autoload :AbstractAdapter
144
+ end
145
+ end
146
+
147
+ module Scoping
148
+ extend ActiveSupport::Autoload
149
+
150
+ eager_autoload do
151
+ autoload :Named
152
+ autoload :Default
153
+ end
154
+ end
155
+
156
+ module Middleware
157
+ extend ActiveSupport::Autoload
158
+
159
+ autoload :DatabaseSelector, "active_record/middleware/database_selector"
160
+ end
161
+
162
+ module Tasks
163
+ extend ActiveSupport::Autoload
164
+
165
+ autoload :DatabaseTasks
166
+ autoload :SQLiteDatabaseTasks, "active_record/tasks/sqlite_database_tasks"
167
+ autoload :MySQLDatabaseTasks, "active_record/tasks/mysql_database_tasks"
168
+ autoload :PostgreSQLDatabaseTasks,
169
+ "active_record/tasks/postgresql_database_tasks"
170
+ end
171
+
172
+ autoload :TestDatabases, "active_record/test_databases"
173
+ autoload :TestFixtures, "active_record/fixtures"
174
+
175
+ def self.eager_load!
176
+ super
177
+ ActiveRecord::Locking.eager_load!
178
+ ActiveRecord::Scoping.eager_load!
179
+ ActiveRecord::Associations.eager_load!
180
+ ActiveRecord::AttributeMethods.eager_load!
181
+ ActiveRecord::ConnectionAdapters.eager_load!
182
+ end
183
+ end
184
+
185
+ ActiveSupport.on_load(:active_record) do
186
+ Arel::Table.engine = self
187
+ end
188
+
189
+ ActiveSupport.on_load(:i18n) do
190
+ I18n.load_path << File.expand_path("active_record/locale/en.yml", __dir__)
191
+ end
192
+
193
+ YAML.load_tags["!ruby/object:ActiveRecord::AttributeSet"] = "ActiveModel::AttributeSet"
194
+ YAML.load_tags["!ruby/object:ActiveRecord::Attribute::FromDatabase"] = "ActiveModel::Attribute::FromDatabase"
195
+ YAML.load_tags["!ruby/object:ActiveRecord::LazyAttributeHash"] = "ActiveModel::LazyAttributeHash"