omg-activerecord 8.0.0.alpha1

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.
Files changed (412) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +355 -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/aggregations.rb +287 -0
  8. data/lib/active_record/association_relation.rb +50 -0
  9. data/lib/active_record/associations/alias_tracker.rb +90 -0
  10. data/lib/active_record/associations/association.rb +417 -0
  11. data/lib/active_record/associations/association_scope.rb +175 -0
  12. data/lib/active_record/associations/belongs_to_association.rb +163 -0
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +50 -0
  14. data/lib/active_record/associations/builder/association.rb +170 -0
  15. data/lib/active_record/associations/builder/belongs_to.rb +160 -0
  16. data/lib/active_record/associations/builder/collection_association.rb +80 -0
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +107 -0
  18. data/lib/active_record/associations/builder/has_many.rb +23 -0
  19. data/lib/active_record/associations/builder/has_one.rb +61 -0
  20. data/lib/active_record/associations/builder/singular_association.rb +48 -0
  21. data/lib/active_record/associations/collection_association.rb +535 -0
  22. data/lib/active_record/associations/collection_proxy.rb +1163 -0
  23. data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
  24. data/lib/active_record/associations/errors.rb +265 -0
  25. data/lib/active_record/associations/foreign_association.rb +40 -0
  26. data/lib/active_record/associations/has_many_association.rb +167 -0
  27. data/lib/active_record/associations/has_many_through_association.rb +232 -0
  28. data/lib/active_record/associations/has_one_association.rb +142 -0
  29. data/lib/active_record/associations/has_one_through_association.rb +45 -0
  30. data/lib/active_record/associations/join_dependency/join_association.rb +106 -0
  31. data/lib/active_record/associations/join_dependency/join_base.rb +23 -0
  32. data/lib/active_record/associations/join_dependency/join_part.rb +71 -0
  33. data/lib/active_record/associations/join_dependency.rb +301 -0
  34. data/lib/active_record/associations/nested_error.rb +47 -0
  35. data/lib/active_record/associations/preloader/association.rb +316 -0
  36. data/lib/active_record/associations/preloader/batch.rb +48 -0
  37. data/lib/active_record/associations/preloader/branch.rb +153 -0
  38. data/lib/active_record/associations/preloader/through_association.rb +150 -0
  39. data/lib/active_record/associations/preloader.rb +135 -0
  40. data/lib/active_record/associations/singular_association.rb +76 -0
  41. data/lib/active_record/associations/through_association.rb +132 -0
  42. data/lib/active_record/associations.rb +1897 -0
  43. data/lib/active_record/asynchronous_queries_tracker.rb +64 -0
  44. data/lib/active_record/attribute_assignment.rb +82 -0
  45. data/lib/active_record/attribute_methods/before_type_cast.rb +106 -0
  46. data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
  47. data/lib/active_record/attribute_methods/dirty.rb +262 -0
  48. data/lib/active_record/attribute_methods/primary_key.rb +158 -0
  49. data/lib/active_record/attribute_methods/query.rb +50 -0
  50. data/lib/active_record/attribute_methods/read.rb +46 -0
  51. data/lib/active_record/attribute_methods/serialization.rb +232 -0
  52. data/lib/active_record/attribute_methods/time_zone_conversion.rb +94 -0
  53. data/lib/active_record/attribute_methods/write.rb +49 -0
  54. data/lib/active_record/attribute_methods.rb +542 -0
  55. data/lib/active_record/attributes.rb +307 -0
  56. data/lib/active_record/autosave_association.rb +586 -0
  57. data/lib/active_record/base.rb +338 -0
  58. data/lib/active_record/callbacks.rb +452 -0
  59. data/lib/active_record/coders/column_serializer.rb +61 -0
  60. data/lib/active_record/coders/json.rb +15 -0
  61. data/lib/active_record/coders/yaml_column.rb +95 -0
  62. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +290 -0
  63. data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +210 -0
  64. data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +78 -0
  65. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +923 -0
  66. data/lib/active_record/connection_adapters/abstract/database_limits.rb +31 -0
  67. data/lib/active_record/connection_adapters/abstract/database_statements.rb +747 -0
  68. data/lib/active_record/connection_adapters/abstract/query_cache.rb +319 -0
  69. data/lib/active_record/connection_adapters/abstract/quoting.rb +239 -0
  70. data/lib/active_record/connection_adapters/abstract/savepoints.rb +24 -0
  71. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +190 -0
  72. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +961 -0
  73. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +106 -0
  74. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1883 -0
  75. data/lib/active_record/connection_adapters/abstract/transaction.rb +676 -0
  76. data/lib/active_record/connection_adapters/abstract_adapter.rb +1218 -0
  77. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +1016 -0
  78. data/lib/active_record/connection_adapters/column.rb +122 -0
  79. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  80. data/lib/active_record/connection_adapters/mysql/column.rb +28 -0
  81. data/lib/active_record/connection_adapters/mysql/database_statements.rb +95 -0
  82. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
  83. data/lib/active_record/connection_adapters/mysql/quoting.rb +114 -0
  84. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +106 -0
  85. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +106 -0
  86. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +97 -0
  87. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +300 -0
  88. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +40 -0
  89. data/lib/active_record/connection_adapters/mysql2/database_statements.rb +96 -0
  90. data/lib/active_record/connection_adapters/mysql2_adapter.rb +196 -0
  91. data/lib/active_record/connection_adapters/pool_config.rb +83 -0
  92. data/lib/active_record/connection_adapters/pool_manager.rb +57 -0
  93. data/lib/active_record/connection_adapters/postgresql/column.rb +82 -0
  94. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +231 -0
  95. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +91 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +53 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +15 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +17 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +54 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +31 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +36 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +15 -0
  104. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +20 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +109 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +15 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  108. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +15 -0
  109. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  110. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  111. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +42 -0
  112. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +15 -0
  113. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +74 -0
  114. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +124 -0
  115. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +18 -0
  116. data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
  117. data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
  118. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +125 -0
  119. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +45 -0
  120. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +28 -0
  121. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +30 -0
  122. data/lib/active_record/connection_adapters/postgresql/oid.rb +38 -0
  123. data/lib/active_record/connection_adapters/postgresql/quoting.rb +238 -0
  124. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +71 -0
  125. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +169 -0
  126. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +392 -0
  127. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +127 -0
  128. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +1162 -0
  129. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +44 -0
  130. data/lib/active_record/connection_adapters/postgresql/utils.rb +79 -0
  131. data/lib/active_record/connection_adapters/postgresql_adapter.rb +1182 -0
  132. data/lib/active_record/connection_adapters/schema_cache.rb +478 -0
  133. data/lib/active_record/connection_adapters/sql_type_metadata.rb +45 -0
  134. data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
  135. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +145 -0
  136. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  137. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +116 -0
  138. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +37 -0
  139. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +39 -0
  140. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +47 -0
  141. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +221 -0
  142. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +843 -0
  143. data/lib/active_record/connection_adapters/statement_pool.rb +67 -0
  144. data/lib/active_record/connection_adapters/trilogy/database_statements.rb +69 -0
  145. data/lib/active_record/connection_adapters/trilogy_adapter.rb +212 -0
  146. data/lib/active_record/connection_adapters.rb +176 -0
  147. data/lib/active_record/connection_handling.rb +413 -0
  148. data/lib/active_record/core.rb +836 -0
  149. data/lib/active_record/counter_cache.rb +230 -0
  150. data/lib/active_record/database_configurations/connection_url_resolver.rb +105 -0
  151. data/lib/active_record/database_configurations/database_config.rb +104 -0
  152. data/lib/active_record/database_configurations/hash_config.rb +172 -0
  153. data/lib/active_record/database_configurations/url_config.rb +78 -0
  154. data/lib/active_record/database_configurations.rb +309 -0
  155. data/lib/active_record/delegated_type.rb +289 -0
  156. data/lib/active_record/deprecator.rb +7 -0
  157. data/lib/active_record/destroy_association_async_job.rb +38 -0
  158. data/lib/active_record/disable_joins_association_relation.rb +39 -0
  159. data/lib/active_record/dynamic_matchers.rb +121 -0
  160. data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
  161. data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
  162. data/lib/active_record/encryption/cipher.rb +53 -0
  163. data/lib/active_record/encryption/config.rb +70 -0
  164. data/lib/active_record/encryption/configurable.rb +60 -0
  165. data/lib/active_record/encryption/context.rb +42 -0
  166. data/lib/active_record/encryption/contexts.rb +76 -0
  167. data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
  168. data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
  169. data/lib/active_record/encryption/encryptable_record.rb +230 -0
  170. data/lib/active_record/encryption/encrypted_attribute_type.rb +184 -0
  171. data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
  172. data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
  173. data/lib/active_record/encryption/encryptor.rb +177 -0
  174. data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
  175. data/lib/active_record/encryption/errors.rb +15 -0
  176. data/lib/active_record/encryption/extended_deterministic_queries.rb +159 -0
  177. data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
  178. data/lib/active_record/encryption/key.rb +28 -0
  179. data/lib/active_record/encryption/key_generator.rb +53 -0
  180. data/lib/active_record/encryption/key_provider.rb +46 -0
  181. data/lib/active_record/encryption/message.rb +33 -0
  182. data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
  183. data/lib/active_record/encryption/message_serializer.rb +96 -0
  184. data/lib/active_record/encryption/null_encryptor.rb +25 -0
  185. data/lib/active_record/encryption/properties.rb +76 -0
  186. data/lib/active_record/encryption/read_only_null_encryptor.rb +28 -0
  187. data/lib/active_record/encryption/scheme.rb +107 -0
  188. data/lib/active_record/encryption.rb +58 -0
  189. data/lib/active_record/enum.rb +424 -0
  190. data/lib/active_record/errors.rb +614 -0
  191. data/lib/active_record/explain.rb +63 -0
  192. data/lib/active_record/explain_registry.rb +37 -0
  193. data/lib/active_record/explain_subscriber.rb +34 -0
  194. data/lib/active_record/fixture_set/file.rb +89 -0
  195. data/lib/active_record/fixture_set/model_metadata.rb +42 -0
  196. data/lib/active_record/fixture_set/render_context.rb +19 -0
  197. data/lib/active_record/fixture_set/table_row.rb +208 -0
  198. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  199. data/lib/active_record/fixtures.rb +850 -0
  200. data/lib/active_record/future_result.rb +182 -0
  201. data/lib/active_record/gem_version.rb +17 -0
  202. data/lib/active_record/inheritance.rb +366 -0
  203. data/lib/active_record/insert_all.rb +328 -0
  204. data/lib/active_record/integration.rb +209 -0
  205. data/lib/active_record/internal_metadata.rb +164 -0
  206. data/lib/active_record/legacy_yaml_adapter.rb +15 -0
  207. data/lib/active_record/locale/en.yml +48 -0
  208. data/lib/active_record/locking/optimistic.rb +228 -0
  209. data/lib/active_record/locking/pessimistic.rb +102 -0
  210. data/lib/active_record/log_subscriber.rb +149 -0
  211. data/lib/active_record/marshalling.rb +56 -0
  212. data/lib/active_record/message_pack.rb +124 -0
  213. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  214. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  215. data/lib/active_record/middleware/database_selector.rb +87 -0
  216. data/lib/active_record/middleware/shard_selector.rb +62 -0
  217. data/lib/active_record/migration/command_recorder.rb +406 -0
  218. data/lib/active_record/migration/compatibility.rb +490 -0
  219. data/lib/active_record/migration/default_strategy.rb +22 -0
  220. data/lib/active_record/migration/execution_strategy.rb +19 -0
  221. data/lib/active_record/migration/join_table.rb +16 -0
  222. data/lib/active_record/migration/pending_migration_connection.rb +21 -0
  223. data/lib/active_record/migration.rb +1626 -0
  224. data/lib/active_record/model_schema.rb +635 -0
  225. data/lib/active_record/nested_attributes.rb +633 -0
  226. data/lib/active_record/no_touching.rb +65 -0
  227. data/lib/active_record/normalization.rb +163 -0
  228. data/lib/active_record/persistence.rb +968 -0
  229. data/lib/active_record/promise.rb +84 -0
  230. data/lib/active_record/query_cache.rb +56 -0
  231. data/lib/active_record/query_logs.rb +247 -0
  232. data/lib/active_record/query_logs_formatter.rb +30 -0
  233. data/lib/active_record/querying.rb +122 -0
  234. data/lib/active_record/railtie.rb +440 -0
  235. data/lib/active_record/railties/console_sandbox.rb +5 -0
  236. data/lib/active_record/railties/controller_runtime.rb +65 -0
  237. data/lib/active_record/railties/databases.rake +641 -0
  238. data/lib/active_record/railties/job_runtime.rb +23 -0
  239. data/lib/active_record/readonly_attributes.rb +66 -0
  240. data/lib/active_record/reflection.rb +1287 -0
  241. data/lib/active_record/relation/batches/batch_enumerator.rb +115 -0
  242. data/lib/active_record/relation/batches.rb +491 -0
  243. data/lib/active_record/relation/calculations.rb +679 -0
  244. data/lib/active_record/relation/delegation.rb +154 -0
  245. data/lib/active_record/relation/finder_methods.rb +661 -0
  246. data/lib/active_record/relation/from_clause.rb +30 -0
  247. data/lib/active_record/relation/merger.rb +192 -0
  248. data/lib/active_record/relation/predicate_builder/array_handler.rb +48 -0
  249. data/lib/active_record/relation/predicate_builder/association_query_value.rb +76 -0
  250. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  251. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +60 -0
  252. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  253. data/lib/active_record/relation/predicate_builder/relation_handler.rb +24 -0
  254. data/lib/active_record/relation/predicate_builder.rb +181 -0
  255. data/lib/active_record/relation/query_attribute.rb +68 -0
  256. data/lib/active_record/relation/query_methods.rb +2235 -0
  257. data/lib/active_record/relation/record_fetch_warning.rb +52 -0
  258. data/lib/active_record/relation/spawn_methods.rb +78 -0
  259. data/lib/active_record/relation/where_clause.rb +218 -0
  260. data/lib/active_record/relation.rb +1495 -0
  261. data/lib/active_record/result.rb +249 -0
  262. data/lib/active_record/runtime_registry.rb +82 -0
  263. data/lib/active_record/sanitization.rb +254 -0
  264. data/lib/active_record/schema.rb +77 -0
  265. data/lib/active_record/schema_dumper.rb +364 -0
  266. data/lib/active_record/schema_migration.rb +106 -0
  267. data/lib/active_record/scoping/default.rb +205 -0
  268. data/lib/active_record/scoping/named.rb +202 -0
  269. data/lib/active_record/scoping.rb +136 -0
  270. data/lib/active_record/secure_password.rb +60 -0
  271. data/lib/active_record/secure_token.rb +66 -0
  272. data/lib/active_record/serialization.rb +29 -0
  273. data/lib/active_record/signed_id.rb +137 -0
  274. data/lib/active_record/statement_cache.rb +164 -0
  275. data/lib/active_record/store.rb +299 -0
  276. data/lib/active_record/suppressor.rb +59 -0
  277. data/lib/active_record/table_metadata.rb +85 -0
  278. data/lib/active_record/tasks/database_tasks.rb +681 -0
  279. data/lib/active_record/tasks/mysql_database_tasks.rb +120 -0
  280. data/lib/active_record/tasks/postgresql_database_tasks.rb +147 -0
  281. data/lib/active_record/tasks/sqlite_database_tasks.rb +89 -0
  282. data/lib/active_record/test_databases.rb +24 -0
  283. data/lib/active_record/test_fixtures.rb +321 -0
  284. data/lib/active_record/testing/query_assertions.rb +121 -0
  285. data/lib/active_record/timestamp.rb +177 -0
  286. data/lib/active_record/token_for.rb +123 -0
  287. data/lib/active_record/touch_later.rb +70 -0
  288. data/lib/active_record/transaction.rb +132 -0
  289. data/lib/active_record/transactions.rb +523 -0
  290. data/lib/active_record/translation.rb +22 -0
  291. data/lib/active_record/type/adapter_specific_registry.rb +144 -0
  292. data/lib/active_record/type/date.rb +9 -0
  293. data/lib/active_record/type/date_time.rb +9 -0
  294. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  295. data/lib/active_record/type/hash_lookup_type_map.rb +57 -0
  296. data/lib/active_record/type/internal/timezone.rb +22 -0
  297. data/lib/active_record/type/json.rb +30 -0
  298. data/lib/active_record/type/serialized.rb +76 -0
  299. data/lib/active_record/type/text.rb +11 -0
  300. data/lib/active_record/type/time.rb +35 -0
  301. data/lib/active_record/type/type_map.rb +58 -0
  302. data/lib/active_record/type/unsigned_integer.rb +16 -0
  303. data/lib/active_record/type.rb +83 -0
  304. data/lib/active_record/type_caster/connection.rb +33 -0
  305. data/lib/active_record/type_caster/map.rb +23 -0
  306. data/lib/active_record/type_caster.rb +9 -0
  307. data/lib/active_record/validations/absence.rb +25 -0
  308. data/lib/active_record/validations/associated.rb +65 -0
  309. data/lib/active_record/validations/length.rb +26 -0
  310. data/lib/active_record/validations/numericality.rb +36 -0
  311. data/lib/active_record/validations/presence.rb +45 -0
  312. data/lib/active_record/validations/uniqueness.rb +295 -0
  313. data/lib/active_record/validations.rb +101 -0
  314. data/lib/active_record/version.rb +10 -0
  315. data/lib/active_record.rb +616 -0
  316. data/lib/arel/alias_predication.rb +9 -0
  317. data/lib/arel/attributes/attribute.rb +33 -0
  318. data/lib/arel/collectors/bind.rb +31 -0
  319. data/lib/arel/collectors/composite.rb +46 -0
  320. data/lib/arel/collectors/plain_string.rb +20 -0
  321. data/lib/arel/collectors/sql_string.rb +27 -0
  322. data/lib/arel/collectors/substitute_binds.rb +35 -0
  323. data/lib/arel/crud.rb +48 -0
  324. data/lib/arel/delete_manager.rb +32 -0
  325. data/lib/arel/errors.rb +19 -0
  326. data/lib/arel/expressions.rb +29 -0
  327. data/lib/arel/factory_methods.rb +53 -0
  328. data/lib/arel/filter_predications.rb +9 -0
  329. data/lib/arel/insert_manager.rb +48 -0
  330. data/lib/arel/math.rb +45 -0
  331. data/lib/arel/nodes/ascending.rb +23 -0
  332. data/lib/arel/nodes/binary.rb +125 -0
  333. data/lib/arel/nodes/bind_param.rb +44 -0
  334. data/lib/arel/nodes/bound_sql_literal.rb +65 -0
  335. data/lib/arel/nodes/case.rb +55 -0
  336. data/lib/arel/nodes/casted.rb +62 -0
  337. data/lib/arel/nodes/comment.rb +29 -0
  338. data/lib/arel/nodes/count.rb +12 -0
  339. data/lib/arel/nodes/cte.rb +36 -0
  340. data/lib/arel/nodes/delete_statement.rb +44 -0
  341. data/lib/arel/nodes/descending.rb +23 -0
  342. data/lib/arel/nodes/equality.rb +15 -0
  343. data/lib/arel/nodes/extract.rb +24 -0
  344. data/lib/arel/nodes/false.rb +16 -0
  345. data/lib/arel/nodes/filter.rb +10 -0
  346. data/lib/arel/nodes/fragments.rb +35 -0
  347. data/lib/arel/nodes/full_outer_join.rb +8 -0
  348. data/lib/arel/nodes/function.rb +45 -0
  349. data/lib/arel/nodes/grouping.rb +11 -0
  350. data/lib/arel/nodes/homogeneous_in.rb +68 -0
  351. data/lib/arel/nodes/in.rb +15 -0
  352. data/lib/arel/nodes/infix_operation.rb +92 -0
  353. data/lib/arel/nodes/inner_join.rb +8 -0
  354. data/lib/arel/nodes/insert_statement.rb +37 -0
  355. data/lib/arel/nodes/join_source.rb +20 -0
  356. data/lib/arel/nodes/leading_join.rb +8 -0
  357. data/lib/arel/nodes/matches.rb +18 -0
  358. data/lib/arel/nodes/named_function.rb +23 -0
  359. data/lib/arel/nodes/nary.rb +39 -0
  360. data/lib/arel/nodes/node.rb +161 -0
  361. data/lib/arel/nodes/node_expression.rb +13 -0
  362. data/lib/arel/nodes/ordering.rb +27 -0
  363. data/lib/arel/nodes/outer_join.rb +8 -0
  364. data/lib/arel/nodes/over.rb +15 -0
  365. data/lib/arel/nodes/regexp.rb +16 -0
  366. data/lib/arel/nodes/right_outer_join.rb +8 -0
  367. data/lib/arel/nodes/select_core.rb +67 -0
  368. data/lib/arel/nodes/select_statement.rb +41 -0
  369. data/lib/arel/nodes/sql_literal.rb +32 -0
  370. data/lib/arel/nodes/string_join.rb +11 -0
  371. data/lib/arel/nodes/table_alias.rb +35 -0
  372. data/lib/arel/nodes/terminal.rb +16 -0
  373. data/lib/arel/nodes/true.rb +16 -0
  374. data/lib/arel/nodes/unary.rb +44 -0
  375. data/lib/arel/nodes/unary_operation.rb +20 -0
  376. data/lib/arel/nodes/unqualified_column.rb +22 -0
  377. data/lib/arel/nodes/update_statement.rb +46 -0
  378. data/lib/arel/nodes/values_list.rb +9 -0
  379. data/lib/arel/nodes/window.rb +126 -0
  380. data/lib/arel/nodes/with.rb +11 -0
  381. data/lib/arel/nodes.rb +75 -0
  382. data/lib/arel/order_predications.rb +13 -0
  383. data/lib/arel/predications.rb +260 -0
  384. data/lib/arel/select_manager.rb +276 -0
  385. data/lib/arel/table.rb +121 -0
  386. data/lib/arel/tree_manager.rb +65 -0
  387. data/lib/arel/update_manager.rb +49 -0
  388. data/lib/arel/visitors/dot.rb +299 -0
  389. data/lib/arel/visitors/mysql.rb +111 -0
  390. data/lib/arel/visitors/postgresql.rb +99 -0
  391. data/lib/arel/visitors/sqlite.rb +38 -0
  392. data/lib/arel/visitors/to_sql.rb +1033 -0
  393. data/lib/arel/visitors/visitor.rb +45 -0
  394. data/lib/arel/visitors.rb +13 -0
  395. data/lib/arel/window_predications.rb +9 -0
  396. data/lib/arel.rb +73 -0
  397. data/lib/rails/generators/active_record/application_record/USAGE +8 -0
  398. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  399. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  400. data/lib/rails/generators/active_record/migration/migration_generator.rb +76 -0
  401. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +29 -0
  402. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +48 -0
  403. data/lib/rails/generators/active_record/migration.rb +54 -0
  404. data/lib/rails/generators/active_record/model/USAGE +113 -0
  405. data/lib/rails/generators/active_record/model/model_generator.rb +94 -0
  406. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  407. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  408. data/lib/rails/generators/active_record/model/templates/module.rb.tt +7 -0
  409. data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
  410. data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
  411. data/lib/rails/generators/active_record.rb +19 -0
  412. metadata +505 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: af48132f380aa97d919eb79e228d9281388a9955f38bc3dfc5dea1f15fa107f8
4
+ data.tar.gz: 67f37270d088a8895b26cdfb25fe01945694b87d933b646fdcaf1d0539a97df6
5
+ SHA512:
6
+ metadata.gz: 3fecce60f5e9a8fccd6e8a880a232734807a7e4b0d0688059f0a6bb0013d37316ec9c71667192d393e10c811519e3c38c76c7f789ae792bb792a79ebeb275283
7
+ data.tar.gz: ea0310fe6afd7dd364d72ab568bef83b083ca044dd5a30dc63bf50e99dd4a37415c082b63839d1b4cf4037dfcb90534eb0097bcffea61e982e08247b17b1fa42
data/CHANGELOG.md ADDED
@@ -0,0 +1,355 @@
1
+ * Allow `drop_table` to accept an array of table names.
2
+
3
+ This will let you to drop multiple tables in a single call.
4
+
5
+ ```ruby
6
+ ActiveRecord::Base.connection.drop_table(:users, :posts)
7
+ ```
8
+
9
+ *Gabriel Sobrinho*
10
+
11
+ * Add support for PostgreSQL `IF NOT EXISTS` via the `:if_not_exists` option
12
+ on the `add_enum_value` method.
13
+
14
+ *Ariel Rzezak*
15
+
16
+ * When running `db:migrate` on a fresh database, load the database schema before running migrations.
17
+
18
+ *Andrew Novoselac*
19
+
20
+ * Fix an issue where `.left_outer_joins` used with multiple associations that have
21
+ the same child association but different parents does not join all parents.
22
+
23
+ Previously, using `.left_outer_joins` with the same child association would only join one of the parents.
24
+
25
+ Now it will correctly join both parents.
26
+
27
+ Fixes #41498.
28
+
29
+ *Garrett Blehm*
30
+
31
+ * Deprecate `unsigned_float` and `unsigned_decimal` short-hand column methods.
32
+
33
+ As of MySQL 8.0.17, the UNSIGNED attribute is deprecated for columns of type FLOAT, DOUBLE,
34
+ and DECIMAL. Consider using a simple CHECK constraint instead for such columns.
35
+
36
+ https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html
37
+
38
+ *Ryuta Kamizono*
39
+
40
+ * Drop MySQL 5.5 support.
41
+
42
+ MySQL 5.5 is the only version that does not support datetime with precision,
43
+ which we have supported in the core. Now we support MySQL 5.6.4 or later, which
44
+ is the first version to support datetime with precision.
45
+
46
+ *Ryuta Kamizono*
47
+
48
+ * Make Active Record asynchronous queries compatible with transactional fixtures.
49
+
50
+ Previously transactional fixtures would disable asynchronous queries, because transactional
51
+ fixtures impose all queries use the same connection.
52
+
53
+ Now asynchronous queries will use the connection pinned by transactional fixtures, and behave
54
+ much closer to production.
55
+
56
+ *Jean Boussier*
57
+
58
+ * Deserialize binary data before decrypting
59
+
60
+ This ensures that we call `PG::Connection.unescape_bytea` on PostgreSQL before decryption.
61
+
62
+ *Donal McBreen*
63
+
64
+ * Ensure `ActiveRecord::Encryption.config` is always ready before access.
65
+
66
+ Previously, `ActiveRecord::Encryption` configuration was deferred until `ActiveRecord::Base`
67
+ was loaded. Therefore, accessing `ActiveRecord::Encryption.config` properties before
68
+ `ActiveRecord::Base` was loaded would give incorrect results.
69
+
70
+ `ActiveRecord::Encryption` now has its own loading hook so that its configuration is set as
71
+ soon as needed.
72
+
73
+ When `ActiveRecord::Base` is loaded, even lazily, it in turn triggers the loading of
74
+ `ActiveRecord::Encryption`, thus preserving the original behavior of having its config ready
75
+ before any use of `ActiveRecord::Base`.
76
+
77
+ *Maxime Réty*
78
+
79
+ * Add `TimeZoneConverter#==` method, so objects will be properly compared by
80
+ their type, scale, limit & precision.
81
+
82
+ Address #52699.
83
+
84
+ *Ruy Rocha*
85
+
86
+ * Add support for SQLite3 full-text-search and other virtual tables.
87
+
88
+ Previously, adding sqlite3 virtual tables messed up `schema.rb`.
89
+
90
+ Now, virtual tables can safely be added using `create_virtual_table`.
91
+
92
+ *Zacharias Knudsen*
93
+
94
+ * Support use of alternative database interfaces via the `database_cli` ActiveRecord configuration option.
95
+
96
+ ```ruby
97
+ Rails.application.configure do
98
+ config.active_record.database_cli = { postgresql: "pgcli" }
99
+ end
100
+ ```
101
+
102
+ *T S Vallender*
103
+
104
+ * Add support for dumping table inheritance and native partitioning table definitions for PostgeSQL adapter
105
+
106
+ *Justin Talbott*
107
+
108
+ * Infer default `:inverse_of` option for `delegated_type` definitions.
109
+
110
+ ```ruby
111
+ class Entry < ApplicationRecord
112
+ delegated_type :entryable, types: %w[ Message ]
113
+ # => defaults to inverse_of: :entry
114
+ end
115
+ ```
116
+
117
+ *Sean Doyle*
118
+
119
+ * Add support for `ActiveRecord::Point` type casts using `Hash` values
120
+
121
+ This allows `ActiveRecord::Point` to be cast or serialized from a hash
122
+ with `:x` and `:y` keys of numeric values, mirroring the functionality of
123
+ existing casts for string and array values. Both string and symbol keys are
124
+ supported.
125
+
126
+ ```ruby
127
+ class PostgresqlPoint < ActiveRecord::Base
128
+ attribute :x, :point
129
+ attribute :y, :point
130
+ attribute :z, :point
131
+ end
132
+
133
+ val = PostgresqlPoint.new({
134
+ x: '(12.34, -43.21)',
135
+ y: [12.34, '-43.21'],
136
+ z: {x: '12.34', y: -43.21}
137
+ })
138
+ ActiveRecord::Point.new(12.32, -43.21) == val.x == val.y == val.z
139
+ ```
140
+
141
+ *Stephen Drew*
142
+
143
+ * Replace `SQLite3::Database#busy_timeout` with `#busy_handler_timeout=`.
144
+
145
+ Provides a non-GVL-blocking, fair retry interval busy handler implementation.
146
+
147
+ *Stephen Margheim*
148
+
149
+ * SQLite3Adapter: Translate `SQLite3::BusyException` into `ActiveRecord::StatementTimeout`.
150
+
151
+ *Matthew Nguyen*
152
+
153
+ * Include schema name in `enable_extension` statements in `db/schema.rb`.
154
+
155
+ The schema dumper will now include the schema name in generated
156
+ `enable_extension` statements if they differ from the current schema.
157
+
158
+ For example, if you have a migration:
159
+
160
+ ```ruby
161
+ enable_extension "heroku_ext.pgcrypto"
162
+ enable_extension "pg_stat_statements"
163
+ ```
164
+
165
+ then the generated schema dump will also contain:
166
+
167
+ ```ruby
168
+ enable_extension "heroku_ext.pgcrypto"
169
+ enable_extension "pg_stat_statements"
170
+ ```
171
+
172
+ *Tony Novak*
173
+
174
+ * Fix `ActiveRecord::Encryption::EncryptedAttributeType#type` to return
175
+ actual cast type.
176
+
177
+ *Vasiliy Ermolovich*
178
+
179
+ * SQLite3Adapter: Bulk insert fixtures.
180
+
181
+ Previously one insert command was executed for each fixture, now they are
182
+ aggregated in a single bulk insert command.
183
+
184
+ *Lázaro Nixon*
185
+
186
+ * PostgreSQLAdapter: Allow `disable_extension` to be called with schema-qualified name.
187
+
188
+ For parity with `enable_extension`, the `disable_extension` method can be called with a schema-qualified
189
+ name (e.g. `disable_extension "myschema.pgcrypto"`). Note that PostgreSQL's `DROP EXTENSION` does not
190
+ actually take a schema name (unlike `CREATE EXTENSION`), so the resulting SQL statement will only name
191
+ the extension, e.g. `DROP EXTENSION IF EXISTS "pgcrypto"`.
192
+
193
+ *Tony Novak*
194
+
195
+ * Make `create_schema` / `drop_schema` reversible in migrations.
196
+
197
+ Previously, `create_schema` and `drop_schema` were irreversible migration operations.
198
+
199
+ *Tony Novak*
200
+
201
+ * Support batching using custom columns.
202
+
203
+ ```ruby
204
+ Product.in_batches(cursor: [:shop_id, :id]) do |relation|
205
+ # do something with relation
206
+ end
207
+ ```
208
+
209
+ *fatkodima*
210
+
211
+ * Use SQLite `IMMEDIATE` transactions when possible.
212
+
213
+ Transactions run against the SQLite3 adapter default to IMMEDIATE mode to improve concurrency support and avoid busy exceptions.
214
+
215
+ *Stephen Margheim*
216
+
217
+ * Raise specific exception when a connection is not defined.
218
+
219
+ The new `ConnectionNotDefined` exception provides connection name, shard and role accessors indicating the details of the connection that was requested.
220
+
221
+ *Hana Harencarova*, *Matthew Draper*
222
+
223
+ * Delete the deprecated constant `ActiveRecord::ImmutableRelation`.
224
+
225
+ *Xavier Noria*
226
+
227
+ * Fix duplicate callback execution when child autosaves parent with `has_one` and `belongs_to`.
228
+
229
+ Before, persisting a new child record with a new associated parent record would run `before_validation`,
230
+ `after_validation`, `before_save` and `after_save` callbacks twice.
231
+
232
+ Now, these callbacks are only executed once as expected.
233
+
234
+ *Joshua Young*
235
+
236
+ * `ActiveRecord::Encryption::Encryptor` now supports a `:compressor` option to customize the compression algorithm used.
237
+
238
+ ```ruby
239
+ module ZstdCompressor
240
+ def self.deflate(data)
241
+ Zstd.compress(data)
242
+ end
243
+
244
+ def self.inflate(data)
245
+ Zstd.decompress(data)
246
+ end
247
+ end
248
+
249
+ class User
250
+ encrypts :name, compressor: ZstdCompressor
251
+ end
252
+ ```
253
+
254
+ You disable compression by passing `compress: false`.
255
+
256
+ ```ruby
257
+ class User
258
+ encrypts :name, compress: false
259
+ end
260
+ ```
261
+
262
+ *heka1024*
263
+
264
+ * Add condensed `#inspect` for `ConnectionPool`, `AbstractAdapter`, and
265
+ `DatabaseConfig`.
266
+
267
+ *Hartley McGuire*
268
+
269
+ * Add `.shard_keys`, `.sharded?`, & `.connected_to_all_shards` methods.
270
+
271
+ ```ruby
272
+ class ShardedBase < ActiveRecord::Base
273
+ self.abstract_class = true
274
+
275
+ connects_to shards: {
276
+ shard_one: { writing: :shard_one },
277
+ shard_two: { writing: :shard_two }
278
+ }
279
+ end
280
+
281
+ class ShardedModel < ShardedBase
282
+ end
283
+
284
+ ShardedModel.shard_keys => [:shard_one, :shard_two]
285
+ ShardedModel.sharded? => true
286
+ ShardedBase.connected_to_all_shards { ShardedModel.current_shard } => [:shard_one, :shard_two]
287
+ ```
288
+
289
+ *Nony Dutton*
290
+
291
+ * Add a `filter` option to `in_order_of` to prioritize certain values in the sorting without filtering the results
292
+ by these values.
293
+
294
+ *Igor Depolli*
295
+
296
+ * Fix an issue where the IDs reader method did not return expected results
297
+ for preloaded associations in models using composite primary keys.
298
+
299
+ *Jay Ang*
300
+
301
+ * Allow to configure `strict_loading_mode` globally or within a model.
302
+
303
+ Defaults to `:all`, can be changed to `:n_plus_one_only`.
304
+
305
+ *Garen Torikian*
306
+
307
+ * Add `ActiveRecord::Relation#readonly?`.
308
+
309
+ Reflects if the relation has been marked as readonly.
310
+
311
+ *Theodor Tonum*
312
+
313
+ * Improve `ActiveRecord::Store` to raise a descriptive exception if the column is not either
314
+ structured (e.g., PostgreSQL +hstore+/+json+, or MySQL +json+) or declared serializable via
315
+ `ActiveRecord.store`.
316
+
317
+ Previously, a `NoMethodError` would be raised when the accessor was read or written:
318
+
319
+ NoMethodError: undefined method `accessor' for an instance of ActiveRecord::Type::Text
320
+
321
+ Now, a descriptive `ConfigurationError` is raised:
322
+
323
+ ActiveRecord::ConfigurationError: the column 'metadata' has not been configured as a store.
324
+ Please make sure the column is declared serializable via 'ActiveRecord.store' or, if your
325
+ database supports it, use a structured column type like hstore or json.
326
+
327
+ *Mike Dalessio*
328
+
329
+ * Fix inference of association model on nested models with the same demodularized name.
330
+
331
+ E.g. with the following setup:
332
+
333
+ ```ruby
334
+ class Nested::Post < ApplicationRecord
335
+ has_one :post, through: :other
336
+ end
337
+ ```
338
+
339
+ Before, `#post` would infer the model as `Nested::Post`, but now it correctly infers `Post`.
340
+
341
+ *Joshua Young*
342
+
343
+ * Add public method for checking if a table is ignored by the schema cache.
344
+
345
+ Previously, an application would need to reimplement `ignored_table?` from the schema cache class to check if a table was set to be ignored. This adds a public method to support this and updates the schema cache to use that directly.
346
+
347
+ ```ruby
348
+ ActiveRecord.schema_cache_ignored_tables = ["developers"]
349
+ ActiveRecord.schema_cache_ignored_table?("developers")
350
+ => true
351
+ ```
352
+
353
+ *Eileen M. Uchitelle*
354
+
355
+ Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md) for previous changes.
data/MIT-LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 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.
data/README.rdoc ADDED
@@ -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://guides.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
+ The Product class is automatically mapped to the table named "products",
26
+ which might look like this:
27
+
28
+ CREATE TABLE products (
29
+ id bigint NOT NULL auto_increment,
30
+ name varchar(255),
31
+ PRIMARY KEY (id)
32
+ );
33
+
34
+ This would also define the following accessors: <tt>Product#name</tt> and
35
+ <tt>Product#name=(new_name)</tt>.
36
+
37
+ {Learn more}[https://api.rubyonrails.org/classes/ActiveRecord/Base.html]
38
+
39
+ * Associations between objects defined by simple class methods.
40
+
41
+ class Firm < ActiveRecord::Base
42
+ has_many :clients
43
+ has_one :account
44
+ belongs_to :conglomerate
45
+ end
46
+
47
+ {Learn more}[https://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html]
48
+
49
+
50
+ * Aggregations of value objects.
51
+
52
+ class Account < ActiveRecord::Base
53
+ composed_of :balance, class_name: 'Money',
54
+ mapping: %w(balance amount)
55
+ composed_of :address,
56
+ mapping: [%w(address_street street), %w(address_city city)]
57
+ end
58
+
59
+ {Learn more}[https://api.rubyonrails.org/classes/ActiveRecord/Aggregations/ClassMethods.html]
60
+
61
+
62
+ * Validation rules that can differ for new or existing objects.
63
+
64
+ class Account < ActiveRecord::Base
65
+ validates :subdomain, :name, :email_address, :password, presence: true
66
+ validates :subdomain, uniqueness: true
67
+ validates :terms_of_service, acceptance: true, on: :create
68
+ validates :password, :email_address, confirmation: true, on: :create
69
+ end
70
+
71
+ {Learn more}[https://api.rubyonrails.org/classes/ActiveRecord/Validations.html]
72
+
73
+
74
+ * Callbacks available for the entire life cycle (instantiation, saving, destroying, validating, etc.).
75
+
76
+ class Person < ActiveRecord::Base
77
+ before_destroy :invalidate_payment_plan
78
+ # the `invalidate_payment_plan` method gets called just before Person#destroy
79
+ end
80
+
81
+ {Learn more}[https://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html]
82
+
83
+
84
+ * Inheritance hierarchies.
85
+
86
+ class Company < ActiveRecord::Base; end
87
+ class Firm < Company; end
88
+ class Client < Company; end
89
+ class PriorityClient < Client; end
90
+
91
+ {Learn more}[https://api.rubyonrails.org/classes/ActiveRecord/Base.html]
92
+
93
+
94
+ * Transactions.
95
+
96
+ # Database transaction
97
+ Account.transaction do
98
+ david.withdrawal(100)
99
+ mary.deposit(100)
100
+ end
101
+
102
+ {Learn more}[https://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html]
103
+
104
+
105
+ * Reflections on columns, associations, and aggregations.
106
+
107
+ reflection = Firm.reflect_on_association(:clients)
108
+ reflection.klass # => Client (class)
109
+ Firm.columns # Returns an array of column descriptors for the firms table
110
+
111
+ {Learn more}[https://api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html]
112
+
113
+
114
+ * Database abstraction through simple adapters.
115
+
116
+ # connect to SQLite3
117
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'dbfile.sqlite3')
118
+
119
+ # connect to MySQL with authentication
120
+ ActiveRecord::Base.establish_connection(
121
+ adapter: 'mysql2',
122
+ host: 'localhost',
123
+ username: 'me',
124
+ password: 'secret',
125
+ database: 'activerecord'
126
+ )
127
+
128
+ {Learn more}[https://api.rubyonrails.org/classes/ActiveRecord/Base.html] and read about the built-in support for
129
+ MySQL[https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Mysql2Adapter.html],
130
+ PostgreSQL[https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html], and
131
+ SQLite3[https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SQLite3Adapter.html].
132
+
133
+
134
+ * Logging support for Log4r[https://github.com/colbygk/log4r] and Logger[https://docs.ruby-lang.org/en/master/Logger.html].
135
+
136
+ ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT)
137
+ ActiveRecord::Base.logger = Log4r::Logger.new('Application Log')
138
+
139
+
140
+ * Database agnostic schema management with Migrations.
141
+
142
+ class AddSystemSettings < ActiveRecord::Migration[8.0]
143
+ def up
144
+ create_table :system_settings do |t|
145
+ t.string :name
146
+ t.string :label
147
+ t.text :value
148
+ t.string :type
149
+ t.integer :position
150
+ end
151
+
152
+ SystemSetting.create name: 'notice', label: 'Use notice?', value: 1
153
+ end
154
+
155
+ def down
156
+ drop_table :system_settings
157
+ end
158
+ end
159
+
160
+ {Learn more}[https://api.rubyonrails.org/classes/ActiveRecord/Migration.html]
161
+
162
+
163
+ == Philosophy
164
+
165
+ Active Record is an implementation of the object-relational mapping (ORM)
166
+ pattern[https://www.martinfowler.com/eaaCatalog/activeRecord.html] by the same
167
+ name described by Martin Fowler:
168
+
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/main/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://discuss.rubyonrails.org/c/rubyonrails-core