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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +355 -0
- data/MIT-LICENSE +22 -0
- data/README.rdoc +219 -0
- data/examples/performance.rb +185 -0
- data/examples/simple.rb +15 -0
- data/lib/active_record/aggregations.rb +287 -0
- data/lib/active_record/association_relation.rb +50 -0
- data/lib/active_record/associations/alias_tracker.rb +90 -0
- data/lib/active_record/associations/association.rb +417 -0
- data/lib/active_record/associations/association_scope.rb +175 -0
- data/lib/active_record/associations/belongs_to_association.rb +163 -0
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +50 -0
- data/lib/active_record/associations/builder/association.rb +170 -0
- data/lib/active_record/associations/builder/belongs_to.rb +160 -0
- data/lib/active_record/associations/builder/collection_association.rb +80 -0
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +107 -0
- data/lib/active_record/associations/builder/has_many.rb +23 -0
- data/lib/active_record/associations/builder/has_one.rb +61 -0
- data/lib/active_record/associations/builder/singular_association.rb +48 -0
- data/lib/active_record/associations/collection_association.rb +535 -0
- data/lib/active_record/associations/collection_proxy.rb +1163 -0
- data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
- data/lib/active_record/associations/errors.rb +265 -0
- data/lib/active_record/associations/foreign_association.rb +40 -0
- data/lib/active_record/associations/has_many_association.rb +167 -0
- data/lib/active_record/associations/has_many_through_association.rb +232 -0
- data/lib/active_record/associations/has_one_association.rb +142 -0
- data/lib/active_record/associations/has_one_through_association.rb +45 -0
- data/lib/active_record/associations/join_dependency/join_association.rb +106 -0
- data/lib/active_record/associations/join_dependency/join_base.rb +23 -0
- data/lib/active_record/associations/join_dependency/join_part.rb +71 -0
- data/lib/active_record/associations/join_dependency.rb +301 -0
- data/lib/active_record/associations/nested_error.rb +47 -0
- data/lib/active_record/associations/preloader/association.rb +316 -0
- data/lib/active_record/associations/preloader/batch.rb +48 -0
- data/lib/active_record/associations/preloader/branch.rb +153 -0
- data/lib/active_record/associations/preloader/through_association.rb +150 -0
- data/lib/active_record/associations/preloader.rb +135 -0
- data/lib/active_record/associations/singular_association.rb +76 -0
- data/lib/active_record/associations/through_association.rb +132 -0
- data/lib/active_record/associations.rb +1897 -0
- data/lib/active_record/asynchronous_queries_tracker.rb +64 -0
- data/lib/active_record/attribute_assignment.rb +82 -0
- data/lib/active_record/attribute_methods/before_type_cast.rb +106 -0
- data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
- data/lib/active_record/attribute_methods/dirty.rb +262 -0
- data/lib/active_record/attribute_methods/primary_key.rb +158 -0
- data/lib/active_record/attribute_methods/query.rb +50 -0
- data/lib/active_record/attribute_methods/read.rb +46 -0
- data/lib/active_record/attribute_methods/serialization.rb +232 -0
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +94 -0
- data/lib/active_record/attribute_methods/write.rb +49 -0
- data/lib/active_record/attribute_methods.rb +542 -0
- data/lib/active_record/attributes.rb +307 -0
- data/lib/active_record/autosave_association.rb +586 -0
- data/lib/active_record/base.rb +338 -0
- data/lib/active_record/callbacks.rb +452 -0
- data/lib/active_record/coders/column_serializer.rb +61 -0
- data/lib/active_record/coders/json.rb +15 -0
- data/lib/active_record/coders/yaml_column.rb +95 -0
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +290 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +210 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +78 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +923 -0
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +31 -0
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +747 -0
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +319 -0
- data/lib/active_record/connection_adapters/abstract/quoting.rb +239 -0
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +24 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +190 -0
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +961 -0
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +106 -0
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1883 -0
- data/lib/active_record/connection_adapters/abstract/transaction.rb +676 -0
- data/lib/active_record/connection_adapters/abstract_adapter.rb +1218 -0
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +1016 -0
- data/lib/active_record/connection_adapters/column.rb +122 -0
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +28 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +95 -0
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +114 -0
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +106 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +106 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +97 -0
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +300 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +40 -0
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +96 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +196 -0
- data/lib/active_record/connection_adapters/pool_config.rb +83 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +57 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +82 -0
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +231 -0
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +91 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +53 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +17 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +54 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +31 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +36 -0
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +20 -0
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +109 -0
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +42 -0
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +74 -0
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +124 -0
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +18 -0
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +125 -0
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +45 -0
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +28 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +38 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +238 -0
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +71 -0
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +169 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +392 -0
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +127 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +1162 -0
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +79 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +1182 -0
- data/lib/active_record/connection_adapters/schema_cache.rb +478 -0
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +45 -0
- data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +145 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +116 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +37 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +39 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +47 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +221 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +843 -0
- data/lib/active_record/connection_adapters/statement_pool.rb +67 -0
- data/lib/active_record/connection_adapters/trilogy/database_statements.rb +69 -0
- data/lib/active_record/connection_adapters/trilogy_adapter.rb +212 -0
- data/lib/active_record/connection_adapters.rb +176 -0
- data/lib/active_record/connection_handling.rb +413 -0
- data/lib/active_record/core.rb +836 -0
- data/lib/active_record/counter_cache.rb +230 -0
- data/lib/active_record/database_configurations/connection_url_resolver.rb +105 -0
- data/lib/active_record/database_configurations/database_config.rb +104 -0
- data/lib/active_record/database_configurations/hash_config.rb +172 -0
- data/lib/active_record/database_configurations/url_config.rb +78 -0
- data/lib/active_record/database_configurations.rb +309 -0
- data/lib/active_record/delegated_type.rb +289 -0
- data/lib/active_record/deprecator.rb +7 -0
- data/lib/active_record/destroy_association_async_job.rb +38 -0
- data/lib/active_record/disable_joins_association_relation.rb +39 -0
- data/lib/active_record/dynamic_matchers.rb +121 -0
- data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
- data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
- data/lib/active_record/encryption/cipher.rb +53 -0
- data/lib/active_record/encryption/config.rb +70 -0
- data/lib/active_record/encryption/configurable.rb +60 -0
- data/lib/active_record/encryption/context.rb +42 -0
- data/lib/active_record/encryption/contexts.rb +76 -0
- data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
- data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
- data/lib/active_record/encryption/encryptable_record.rb +230 -0
- data/lib/active_record/encryption/encrypted_attribute_type.rb +184 -0
- data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
- data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
- data/lib/active_record/encryption/encryptor.rb +177 -0
- data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
- data/lib/active_record/encryption/errors.rb +15 -0
- data/lib/active_record/encryption/extended_deterministic_queries.rb +159 -0
- data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
- data/lib/active_record/encryption/key.rb +28 -0
- data/lib/active_record/encryption/key_generator.rb +53 -0
- data/lib/active_record/encryption/key_provider.rb +46 -0
- data/lib/active_record/encryption/message.rb +33 -0
- data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
- data/lib/active_record/encryption/message_serializer.rb +96 -0
- data/lib/active_record/encryption/null_encryptor.rb +25 -0
- data/lib/active_record/encryption/properties.rb +76 -0
- data/lib/active_record/encryption/read_only_null_encryptor.rb +28 -0
- data/lib/active_record/encryption/scheme.rb +107 -0
- data/lib/active_record/encryption.rb +58 -0
- data/lib/active_record/enum.rb +424 -0
- data/lib/active_record/errors.rb +614 -0
- data/lib/active_record/explain.rb +63 -0
- data/lib/active_record/explain_registry.rb +37 -0
- data/lib/active_record/explain_subscriber.rb +34 -0
- data/lib/active_record/fixture_set/file.rb +89 -0
- data/lib/active_record/fixture_set/model_metadata.rb +42 -0
- data/lib/active_record/fixture_set/render_context.rb +19 -0
- data/lib/active_record/fixture_set/table_row.rb +208 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +850 -0
- data/lib/active_record/future_result.rb +182 -0
- data/lib/active_record/gem_version.rb +17 -0
- data/lib/active_record/inheritance.rb +366 -0
- data/lib/active_record/insert_all.rb +328 -0
- data/lib/active_record/integration.rb +209 -0
- data/lib/active_record/internal_metadata.rb +164 -0
- data/lib/active_record/legacy_yaml_adapter.rb +15 -0
- data/lib/active_record/locale/en.yml +48 -0
- data/lib/active_record/locking/optimistic.rb +228 -0
- data/lib/active_record/locking/pessimistic.rb +102 -0
- data/lib/active_record/log_subscriber.rb +149 -0
- data/lib/active_record/marshalling.rb +56 -0
- data/lib/active_record/message_pack.rb +124 -0
- data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
- data/lib/active_record/middleware/database_selector.rb +87 -0
- data/lib/active_record/middleware/shard_selector.rb +62 -0
- data/lib/active_record/migration/command_recorder.rb +406 -0
- data/lib/active_record/migration/compatibility.rb +490 -0
- data/lib/active_record/migration/default_strategy.rb +22 -0
- data/lib/active_record/migration/execution_strategy.rb +19 -0
- data/lib/active_record/migration/join_table.rb +16 -0
- data/lib/active_record/migration/pending_migration_connection.rb +21 -0
- data/lib/active_record/migration.rb +1626 -0
- data/lib/active_record/model_schema.rb +635 -0
- data/lib/active_record/nested_attributes.rb +633 -0
- data/lib/active_record/no_touching.rb +65 -0
- data/lib/active_record/normalization.rb +163 -0
- data/lib/active_record/persistence.rb +968 -0
- data/lib/active_record/promise.rb +84 -0
- data/lib/active_record/query_cache.rb +56 -0
- data/lib/active_record/query_logs.rb +247 -0
- data/lib/active_record/query_logs_formatter.rb +30 -0
- data/lib/active_record/querying.rb +122 -0
- data/lib/active_record/railtie.rb +440 -0
- data/lib/active_record/railties/console_sandbox.rb +5 -0
- data/lib/active_record/railties/controller_runtime.rb +65 -0
- data/lib/active_record/railties/databases.rake +641 -0
- data/lib/active_record/railties/job_runtime.rb +23 -0
- data/lib/active_record/readonly_attributes.rb +66 -0
- data/lib/active_record/reflection.rb +1287 -0
- data/lib/active_record/relation/batches/batch_enumerator.rb +115 -0
- data/lib/active_record/relation/batches.rb +491 -0
- data/lib/active_record/relation/calculations.rb +679 -0
- data/lib/active_record/relation/delegation.rb +154 -0
- data/lib/active_record/relation/finder_methods.rb +661 -0
- data/lib/active_record/relation/from_clause.rb +30 -0
- data/lib/active_record/relation/merger.rb +192 -0
- data/lib/active_record/relation/predicate_builder/array_handler.rb +48 -0
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +76 -0
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +60 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +24 -0
- data/lib/active_record/relation/predicate_builder.rb +181 -0
- data/lib/active_record/relation/query_attribute.rb +68 -0
- data/lib/active_record/relation/query_methods.rb +2235 -0
- data/lib/active_record/relation/record_fetch_warning.rb +52 -0
- data/lib/active_record/relation/spawn_methods.rb +78 -0
- data/lib/active_record/relation/where_clause.rb +218 -0
- data/lib/active_record/relation.rb +1495 -0
- data/lib/active_record/result.rb +249 -0
- data/lib/active_record/runtime_registry.rb +82 -0
- data/lib/active_record/sanitization.rb +254 -0
- data/lib/active_record/schema.rb +77 -0
- data/lib/active_record/schema_dumper.rb +364 -0
- data/lib/active_record/schema_migration.rb +106 -0
- data/lib/active_record/scoping/default.rb +205 -0
- data/lib/active_record/scoping/named.rb +202 -0
- data/lib/active_record/scoping.rb +136 -0
- data/lib/active_record/secure_password.rb +60 -0
- data/lib/active_record/secure_token.rb +66 -0
- data/lib/active_record/serialization.rb +29 -0
- data/lib/active_record/signed_id.rb +137 -0
- data/lib/active_record/statement_cache.rb +164 -0
- data/lib/active_record/store.rb +299 -0
- data/lib/active_record/suppressor.rb +59 -0
- data/lib/active_record/table_metadata.rb +85 -0
- data/lib/active_record/tasks/database_tasks.rb +681 -0
- data/lib/active_record/tasks/mysql_database_tasks.rb +120 -0
- data/lib/active_record/tasks/postgresql_database_tasks.rb +147 -0
- data/lib/active_record/tasks/sqlite_database_tasks.rb +89 -0
- data/lib/active_record/test_databases.rb +24 -0
- data/lib/active_record/test_fixtures.rb +321 -0
- data/lib/active_record/testing/query_assertions.rb +121 -0
- data/lib/active_record/timestamp.rb +177 -0
- data/lib/active_record/token_for.rb +123 -0
- data/lib/active_record/touch_later.rb +70 -0
- data/lib/active_record/transaction.rb +132 -0
- data/lib/active_record/transactions.rb +523 -0
- data/lib/active_record/translation.rb +22 -0
- data/lib/active_record/type/adapter_specific_registry.rb +144 -0
- data/lib/active_record/type/date.rb +9 -0
- data/lib/active_record/type/date_time.rb +9 -0
- data/lib/active_record/type/decimal_without_scale.rb +15 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +57 -0
- data/lib/active_record/type/internal/timezone.rb +22 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +76 -0
- data/lib/active_record/type/text.rb +11 -0
- data/lib/active_record/type/time.rb +35 -0
- data/lib/active_record/type/type_map.rb +58 -0
- data/lib/active_record/type/unsigned_integer.rb +16 -0
- data/lib/active_record/type.rb +83 -0
- data/lib/active_record/type_caster/connection.rb +33 -0
- data/lib/active_record/type_caster/map.rb +23 -0
- data/lib/active_record/type_caster.rb +9 -0
- data/lib/active_record/validations/absence.rb +25 -0
- data/lib/active_record/validations/associated.rb +65 -0
- data/lib/active_record/validations/length.rb +26 -0
- data/lib/active_record/validations/numericality.rb +36 -0
- data/lib/active_record/validations/presence.rb +45 -0
- data/lib/active_record/validations/uniqueness.rb +295 -0
- data/lib/active_record/validations.rb +101 -0
- data/lib/active_record/version.rb +10 -0
- data/lib/active_record.rb +616 -0
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +33 -0
- data/lib/arel/collectors/bind.rb +31 -0
- data/lib/arel/collectors/composite.rb +46 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +27 -0
- data/lib/arel/collectors/substitute_binds.rb +35 -0
- data/lib/arel/crud.rb +48 -0
- data/lib/arel/delete_manager.rb +32 -0
- data/lib/arel/errors.rb +19 -0
- data/lib/arel/expressions.rb +29 -0
- data/lib/arel/factory_methods.rb +53 -0
- data/lib/arel/filter_predications.rb +9 -0
- data/lib/arel/insert_manager.rb +48 -0
- data/lib/arel/math.rb +45 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +125 -0
- data/lib/arel/nodes/bind_param.rb +44 -0
- data/lib/arel/nodes/bound_sql_literal.rb +65 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +62 -0
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/cte.rb +36 -0
- data/lib/arel/nodes/delete_statement.rb +44 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +15 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/filter.rb +10 -0
- data/lib/arel/nodes/fragments.rb +35 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +45 -0
- data/lib/arel/nodes/grouping.rb +11 -0
- data/lib/arel/nodes/homogeneous_in.rb +68 -0
- data/lib/arel/nodes/in.rb +15 -0
- data/lib/arel/nodes/infix_operation.rb +92 -0
- data/lib/arel/nodes/inner_join.rb +8 -0
- data/lib/arel/nodes/insert_statement.rb +37 -0
- data/lib/arel/nodes/join_source.rb +20 -0
- data/lib/arel/nodes/leading_join.rb +8 -0
- data/lib/arel/nodes/matches.rb +18 -0
- data/lib/arel/nodes/named_function.rb +23 -0
- data/lib/arel/nodes/nary.rb +39 -0
- data/lib/arel/nodes/node.rb +161 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/ordering.rb +27 -0
- data/lib/arel/nodes/outer_join.rb +8 -0
- data/lib/arel/nodes/over.rb +15 -0
- data/lib/arel/nodes/regexp.rb +16 -0
- data/lib/arel/nodes/right_outer_join.rb +8 -0
- data/lib/arel/nodes/select_core.rb +67 -0
- data/lib/arel/nodes/select_statement.rb +41 -0
- data/lib/arel/nodes/sql_literal.rb +32 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +35 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +44 -0
- data/lib/arel/nodes/unary_operation.rb +20 -0
- data/lib/arel/nodes/unqualified_column.rb +22 -0
- data/lib/arel/nodes/update_statement.rb +46 -0
- data/lib/arel/nodes/values_list.rb +9 -0
- data/lib/arel/nodes/window.rb +126 -0
- data/lib/arel/nodes/with.rb +11 -0
- data/lib/arel/nodes.rb +75 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +260 -0
- data/lib/arel/select_manager.rb +276 -0
- data/lib/arel/table.rb +121 -0
- data/lib/arel/tree_manager.rb +65 -0
- data/lib/arel/update_manager.rb +49 -0
- data/lib/arel/visitors/dot.rb +299 -0
- data/lib/arel/visitors/mysql.rb +111 -0
- data/lib/arel/visitors/postgresql.rb +99 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +1033 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors.rb +13 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +73 -0
- data/lib/rails/generators/active_record/application_record/USAGE +8 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +76 -0
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +29 -0
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +48 -0
- data/lib/rails/generators/active_record/migration.rb +54 -0
- data/lib/rails/generators/active_record/model/USAGE +113 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +94 -0
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
- data/lib/rails/generators/active_record/model/templates/module.rb.tt +7 -0
- data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
- data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
- data/lib/rails/generators/active_record.rb +19 -0
- 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
|