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
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Arel # :nodoc: all
|
|
4
|
+
module Visitors
|
|
5
|
+
class Visitor
|
|
6
|
+
def initialize
|
|
7
|
+
@dispatch = get_dispatch_cache
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def accept(object, collector = nil)
|
|
11
|
+
visit object, collector
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
attr_reader :dispatch
|
|
16
|
+
|
|
17
|
+
def self.dispatch_cache
|
|
18
|
+
@dispatch_cache ||= Hash.new do |hash, klass|
|
|
19
|
+
hash[klass] = :"visit_#{(klass.name || "").gsub("::", "_")}"
|
|
20
|
+
end.compare_by_identity
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def get_dispatch_cache
|
|
24
|
+
self.class.dispatch_cache
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def visit(object, collector = nil)
|
|
28
|
+
dispatch_method = dispatch[object.class]
|
|
29
|
+
if collector
|
|
30
|
+
send dispatch_method, object, collector
|
|
31
|
+
else
|
|
32
|
+
send dispatch_method, object
|
|
33
|
+
end
|
|
34
|
+
rescue NoMethodError => e
|
|
35
|
+
raise e if respond_to?(dispatch_method, true)
|
|
36
|
+
superklass = object.class.ancestors.find { |klass|
|
|
37
|
+
respond_to?(dispatch[klass], true)
|
|
38
|
+
}
|
|
39
|
+
raise(TypeError, "Cannot visit #{object.class}") unless superklass
|
|
40
|
+
dispatch[object.class] = dispatch[superklass]
|
|
41
|
+
retry
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "arel/visitors/visitor"
|
|
4
|
+
require "arel/visitors/to_sql"
|
|
5
|
+
require "arel/visitors/sqlite"
|
|
6
|
+
require "arel/visitors/postgresql"
|
|
7
|
+
require "arel/visitors/mysql"
|
|
8
|
+
require "arel/visitors/dot"
|
|
9
|
+
|
|
10
|
+
module Arel # :nodoc: all
|
|
11
|
+
module Visitors
|
|
12
|
+
end
|
|
13
|
+
end
|
data/lib/arel.rb
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "arel/errors"
|
|
4
|
+
|
|
5
|
+
require "arel/crud"
|
|
6
|
+
require "arel/factory_methods"
|
|
7
|
+
|
|
8
|
+
require "arel/expressions"
|
|
9
|
+
require "arel/predications"
|
|
10
|
+
require "arel/filter_predications"
|
|
11
|
+
require "arel/window_predications"
|
|
12
|
+
require "arel/math"
|
|
13
|
+
require "arel/alias_predication"
|
|
14
|
+
require "arel/order_predications"
|
|
15
|
+
require "arel/table"
|
|
16
|
+
require "arel/attributes/attribute"
|
|
17
|
+
|
|
18
|
+
require "arel/visitors"
|
|
19
|
+
require "arel/collectors/sql_string"
|
|
20
|
+
|
|
21
|
+
require "arel/tree_manager"
|
|
22
|
+
require "arel/insert_manager"
|
|
23
|
+
require "arel/select_manager"
|
|
24
|
+
require "arel/update_manager"
|
|
25
|
+
require "arel/delete_manager"
|
|
26
|
+
require "arel/nodes"
|
|
27
|
+
|
|
28
|
+
module Arel
|
|
29
|
+
VERSION = "10.0.0"
|
|
30
|
+
|
|
31
|
+
# Wrap a known-safe SQL string for passing to query methods, e.g.
|
|
32
|
+
#
|
|
33
|
+
# Post.order(Arel.sql("REPLACE(title, 'misc', 'zzzz') asc")).pluck(:id)
|
|
34
|
+
#
|
|
35
|
+
# Great caution should be taken to avoid SQL injection vulnerabilities.
|
|
36
|
+
# This method should not be used with unsafe values such as request
|
|
37
|
+
# parameters or model attributes.
|
|
38
|
+
#
|
|
39
|
+
# Take a look at the {security guide}[https://guides.rubyonrails.org/security.html#sql-injection]
|
|
40
|
+
# for more information.
|
|
41
|
+
#
|
|
42
|
+
# To construct a more complex query fragment, including the possible
|
|
43
|
+
# use of user-provided values, the +sql_string+ may contain <tt>?</tt> and
|
|
44
|
+
# +:key+ placeholders, corresponding to the additional arguments. Note
|
|
45
|
+
# that this behavior only applies when bind value parameters are
|
|
46
|
+
# supplied in the call; without them, the placeholder tokens have no
|
|
47
|
+
# special meaning, and will be passed through to the query as-is.
|
|
48
|
+
#
|
|
49
|
+
# The +:retryable+ option can be used to mark the SQL as safe to retry.
|
|
50
|
+
# Use this option only if the SQL is idempotent, as it could be executed
|
|
51
|
+
# more than once.
|
|
52
|
+
def self.sql(sql_string, *positional_binds, retryable: false, **named_binds)
|
|
53
|
+
if positional_binds.empty? && named_binds.empty?
|
|
54
|
+
Arel::Nodes::SqlLiteral.new(sql_string, retryable: retryable)
|
|
55
|
+
else
|
|
56
|
+
Arel::Nodes::BoundSqlLiteral.new sql_string, positional_binds, named_binds
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def self.star # :nodoc:
|
|
61
|
+
sql("*", retryable: true)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def self.arel_node?(value) # :nodoc:
|
|
65
|
+
value.is_a?(Arel::Nodes::Node) || value.is_a?(Arel::Attribute) || value.is_a?(Arel::Nodes::SqlLiteral)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def self.fetch_attribute(value, &block) # :nodoc:
|
|
69
|
+
unless String === value
|
|
70
|
+
value.fetch_attribute(&block)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
Description:
|
|
2
|
+
Generates an `ApplicationRecord` base class for other models to inherit from.
|
|
3
|
+
|
|
4
|
+
Example:
|
|
5
|
+
`bin/rails generate application_record`
|
|
6
|
+
|
|
7
|
+
This generates the base class. A test is not generated because no
|
|
8
|
+
behaviour is included in `ApplicationRecord` by default.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails/generators/active_record"
|
|
4
|
+
|
|
5
|
+
module ActiveRecord
|
|
6
|
+
module Generators # :nodoc:
|
|
7
|
+
class ApplicationRecordGenerator < ::Rails::Generators::Base # :nodoc:
|
|
8
|
+
source_root File.expand_path("templates", __dir__)
|
|
9
|
+
|
|
10
|
+
# FIXME: Change this file to a symlink once RubyGems 2.5.0 is required.
|
|
11
|
+
def create_application_record
|
|
12
|
+
template "application_record.rb", application_record_file_name
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
def application_record_file_name
|
|
17
|
+
@application_record_file_name ||=
|
|
18
|
+
if namespaced?
|
|
19
|
+
"app/models/#{namespaced_path}/application_record.rb"
|
|
20
|
+
else
|
|
21
|
+
"app/models/application_record.rb"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails/generators/active_record"
|
|
4
|
+
|
|
5
|
+
module ActiveRecord
|
|
6
|
+
module Generators # :nodoc:
|
|
7
|
+
class MigrationGenerator < Base # :nodoc:
|
|
8
|
+
argument :attributes, type: :array, default: [], banner: "field[:type][:index] field[:type][:index]"
|
|
9
|
+
|
|
10
|
+
class_option :timestamps, type: :boolean
|
|
11
|
+
class_option :primary_key_type, type: :string, desc: "The type for primary key"
|
|
12
|
+
class_option :database, type: :string, aliases: %i(--db), desc: "The database for your migration. By default, the current environment's primary database is used."
|
|
13
|
+
|
|
14
|
+
def create_migration_file
|
|
15
|
+
set_local_assigns!
|
|
16
|
+
validate_file_name!
|
|
17
|
+
migration_template @migration_template, File.join(db_migrate_path, "#{file_name}.rb")
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
attr_reader :migration_action, :join_tables
|
|
22
|
+
|
|
23
|
+
# Sets the default migration template that is being used for the generation of the migration.
|
|
24
|
+
# Depending on command line arguments, the migration template and the table name instance
|
|
25
|
+
# variables are set up.
|
|
26
|
+
def set_local_assigns!
|
|
27
|
+
@migration_template = "migration.rb"
|
|
28
|
+
case file_name
|
|
29
|
+
when /^(add)_.*_to_(.*)/, /^(remove)_.*?_from_(.*)/
|
|
30
|
+
@migration_action = $1
|
|
31
|
+
@table_name = normalize_table_name($2)
|
|
32
|
+
when /join_table/
|
|
33
|
+
if attributes.length == 2
|
|
34
|
+
@migration_action = "join"
|
|
35
|
+
@join_tables = pluralize_table_names? ? attributes.map(&:plural_name) : attributes.map(&:singular_name)
|
|
36
|
+
|
|
37
|
+
set_index_names
|
|
38
|
+
end
|
|
39
|
+
when /^create_(.+)/
|
|
40
|
+
@table_name = normalize_table_name($1)
|
|
41
|
+
@migration_template = "create_table_migration.rb"
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def set_index_names
|
|
46
|
+
attributes.each_with_index do |attr, i|
|
|
47
|
+
attr.index_name = [attr, attributes[i - 1]].map { |a| index_name_for(a) }
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def index_name_for(attribute)
|
|
52
|
+
if attribute.foreign_key?
|
|
53
|
+
attribute.name
|
|
54
|
+
else
|
|
55
|
+
attribute.name.singularize.foreign_key
|
|
56
|
+
end.to_sym
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def attributes_with_index
|
|
60
|
+
attributes.select { |a| !a.reference? && a.has_index? }
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# A migration file name can only contain underscores (_), lowercase characters,
|
|
64
|
+
# and numbers 0-9. Any other file name will raise an IllegalMigrationNameError.
|
|
65
|
+
def validate_file_name!
|
|
66
|
+
unless /^[_a-z0-9]+$/.match?(file_name)
|
|
67
|
+
raise IllegalMigrationNameError.new(file_name)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def normalize_table_name(_table_name)
|
|
72
|
+
pluralize_table_names? ? _table_name.pluralize : _table_name.singularize
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
|
|
2
|
+
def change
|
|
3
|
+
create_table :<%= table_name %><%= primary_key_type %> do |t|
|
|
4
|
+
<% attributes.each do |attribute| -%>
|
|
5
|
+
<% if attribute.password_digest? -%>
|
|
6
|
+
t.string :password_digest<%= attribute.inject_options %>
|
|
7
|
+
<% elsif attribute.token? -%>
|
|
8
|
+
t.string :<%= attribute.name %><%= attribute.inject_options %>
|
|
9
|
+
<% elsif attribute.reference? -%>
|
|
10
|
+
t.<%= attribute.type %> :<%= attribute.name %><%= attribute.inject_options %><%= foreign_key_type %>
|
|
11
|
+
<% elsif !attribute.virtual? -%>
|
|
12
|
+
t.<%= attribute.type %> :<%= attribute.name %><%= attribute.inject_options %>
|
|
13
|
+
<% end -%>
|
|
14
|
+
<% end -%>
|
|
15
|
+
<% unless attributes.empty? -%>
|
|
16
|
+
|
|
17
|
+
<% end -%>
|
|
18
|
+
<% if options[:timestamps] -%>
|
|
19
|
+
t.timestamps
|
|
20
|
+
<% end -%>
|
|
21
|
+
end
|
|
22
|
+
<% attributes.select(&:token?).each do |attribute| -%>
|
|
23
|
+
add_index :<%= table_name %>, :<%= attribute.index_name %><%= attribute.inject_index_options %>, unique: true
|
|
24
|
+
<% end -%>
|
|
25
|
+
<% attributes_with_index.each do |attribute| -%>
|
|
26
|
+
add_index :<%= table_name %>, :<%= attribute.index_name %><%= attribute.inject_index_options %>
|
|
27
|
+
<% end -%>
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
|
|
2
|
+
<%- if migration_action == 'add' -%>
|
|
3
|
+
def change
|
|
4
|
+
<% attributes.each do |attribute| -%>
|
|
5
|
+
<%- if attribute.reference? -%>
|
|
6
|
+
add_reference :<%= table_name %>, :<%= attribute.name %><%= attribute.inject_options %><%= foreign_key_type %>
|
|
7
|
+
<%- elsif attribute.token? -%>
|
|
8
|
+
add_column :<%= table_name %>, :<%= attribute.name %>, :string<%= attribute.inject_options %>
|
|
9
|
+
add_index :<%= table_name %>, :<%= attribute.index_name %><%= attribute.inject_index_options %>, unique: true
|
|
10
|
+
<%- elsif !attribute.virtual? -%>
|
|
11
|
+
add_column :<%= table_name %>, :<%= attribute.name %>, :<%= attribute.type %><%= attribute.inject_options %>
|
|
12
|
+
<%- if attribute.has_index? -%>
|
|
13
|
+
add_index :<%= table_name %>, :<%= attribute.index_name %><%= attribute.inject_index_options %>
|
|
14
|
+
<%- end -%>
|
|
15
|
+
<%- end -%>
|
|
16
|
+
<%- end -%>
|
|
17
|
+
end
|
|
18
|
+
<%- elsif migration_action == 'join' -%>
|
|
19
|
+
def change
|
|
20
|
+
create_join_table :<%= join_tables.first %>, :<%= join_tables.second %> do |t|
|
|
21
|
+
<%- attributes.each do |attribute| -%>
|
|
22
|
+
<%- if attribute.reference? -%>
|
|
23
|
+
t.references :<%= attribute.name %><%= attribute.inject_options %><%= foreign_key_type %>
|
|
24
|
+
<%- elsif !attribute.virtual? -%>
|
|
25
|
+
<%= '# ' unless attribute.has_index? -%>t.index <%= attribute.index_name %><%= attribute.inject_index_options %>
|
|
26
|
+
<%- end -%>
|
|
27
|
+
<%- end -%>
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
<%- else -%>
|
|
31
|
+
def change
|
|
32
|
+
<% attributes.each do |attribute| -%>
|
|
33
|
+
<%- if migration_action -%>
|
|
34
|
+
<%- if attribute.reference? -%>
|
|
35
|
+
remove_reference :<%= table_name %>, :<%= attribute.name %><%= attribute.inject_options %><%= foreign_key_type %>
|
|
36
|
+
<%- else -%>
|
|
37
|
+
<%- if attribute.has_index? -%>
|
|
38
|
+
remove_index :<%= table_name %>, :<%= attribute.index_name %><%= attribute.inject_index_options %>
|
|
39
|
+
<%- end -%>
|
|
40
|
+
<%- if !attribute.virtual? -%>
|
|
41
|
+
remove_column :<%= table_name %>, :<%= attribute.name %>, :<%= attribute.type %><%= attribute.inject_options %>
|
|
42
|
+
<%- end -%>
|
|
43
|
+
<%- end -%>
|
|
44
|
+
<%- end -%>
|
|
45
|
+
<%- end -%>
|
|
46
|
+
end
|
|
47
|
+
<%- end -%>
|
|
48
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails/generators/migration"
|
|
4
|
+
|
|
5
|
+
module ActiveRecord
|
|
6
|
+
module Generators # :nodoc:
|
|
7
|
+
module Migration
|
|
8
|
+
extend ActiveSupport::Concern
|
|
9
|
+
include Rails::Generators::Migration
|
|
10
|
+
|
|
11
|
+
module ClassMethods
|
|
12
|
+
# Implement the required interface for Rails::Generators::Migration.
|
|
13
|
+
def next_migration_number(dirname)
|
|
14
|
+
next_migration_number = current_migration_number(dirname) + 1
|
|
15
|
+
ActiveRecord::Migration.next_migration_number(next_migration_number)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
def primary_key_type
|
|
21
|
+
key_type = options[:primary_key_type]
|
|
22
|
+
", id: :#{key_type}" if key_type
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def foreign_key_type
|
|
26
|
+
key_type = options[:primary_key_type]
|
|
27
|
+
", type: :#{key_type}" if key_type
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def db_migrate_path
|
|
31
|
+
if defined?(Rails.application) && Rails.application
|
|
32
|
+
configured_migrate_path || default_migrate_path
|
|
33
|
+
else
|
|
34
|
+
"db/migrate"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def default_migrate_path
|
|
39
|
+
Rails.application.config.paths["db/migrate"].to_ary.first
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def configured_migrate_path
|
|
43
|
+
return unless database = options[:database]
|
|
44
|
+
|
|
45
|
+
config = ActiveRecord::Base.configurations.configs_for(
|
|
46
|
+
env_name: Rails.env,
|
|
47
|
+
name: database
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
Array(config&.migrations_paths).first
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
Description:
|
|
2
|
+
Generates a new model. Pass the model name, either CamelCased or
|
|
3
|
+
under_scored, and an optional list of attribute pairs as arguments.
|
|
4
|
+
|
|
5
|
+
Attribute pairs are field:type arguments specifying the
|
|
6
|
+
model's attributes. Timestamps are added by default, so you don't have to
|
|
7
|
+
specify them by hand as 'created_at:datetime updated_at:datetime'.
|
|
8
|
+
|
|
9
|
+
As a special case, specifying 'password:digest' will generate a
|
|
10
|
+
password_digest field of string type, and configure your generated model and
|
|
11
|
+
tests for use with Active Model has_secure_password (assuming the default ORM
|
|
12
|
+
and test framework are being used).
|
|
13
|
+
|
|
14
|
+
You don't have to think up every attribute up front, but it helps to
|
|
15
|
+
sketch out a few so you can start working with the model immediately.
|
|
16
|
+
|
|
17
|
+
This generator invokes your configured ORM and test framework, which
|
|
18
|
+
defaults to Active Record and TestUnit.
|
|
19
|
+
|
|
20
|
+
Finally, if --parent option is given, it's used as superclass of the
|
|
21
|
+
created model. This allows you create Single Table Inheritance models.
|
|
22
|
+
|
|
23
|
+
If you pass a namespaced model name (e.g. admin/account or Admin::Account)
|
|
24
|
+
then the generator will create a module with a table_name_prefix method
|
|
25
|
+
to prefix the model's table name with the module name (e.g. admin_accounts)
|
|
26
|
+
|
|
27
|
+
Available field types:
|
|
28
|
+
|
|
29
|
+
Just after the field name you can specify a type like text or boolean.
|
|
30
|
+
It will generate the column with the associated SQL type. For instance:
|
|
31
|
+
|
|
32
|
+
`bin/rails generate model post title:string body:text`
|
|
33
|
+
|
|
34
|
+
will generate a title column with a varchar type and a body column with a text
|
|
35
|
+
type. If no type is specified the string type will be used by default.
|
|
36
|
+
You can use the following types:
|
|
37
|
+
|
|
38
|
+
integer
|
|
39
|
+
primary_key
|
|
40
|
+
decimal
|
|
41
|
+
float
|
|
42
|
+
boolean
|
|
43
|
+
binary
|
|
44
|
+
string
|
|
45
|
+
text
|
|
46
|
+
date
|
|
47
|
+
time
|
|
48
|
+
datetime
|
|
49
|
+
|
|
50
|
+
You can also consider `references` as a kind of type. For instance, if you run:
|
|
51
|
+
|
|
52
|
+
`bin/rails generate model photo title:string album:references`
|
|
53
|
+
|
|
54
|
+
It will generate an `album_id` column. You should generate these kinds of fields when
|
|
55
|
+
you will use a `belongs_to` association, for instance. `references` also supports
|
|
56
|
+
polymorphism, you can enable polymorphism like this:
|
|
57
|
+
|
|
58
|
+
`bin/rails generate model product supplier:references{polymorphic}`
|
|
59
|
+
|
|
60
|
+
For integer, string, text and binary fields, an integer in curly braces will
|
|
61
|
+
be set as the limit:
|
|
62
|
+
|
|
63
|
+
`bin/rails generate model user pseudo:string{30}`
|
|
64
|
+
|
|
65
|
+
For decimal, two integers separated by a comma in curly braces will be used
|
|
66
|
+
for precision and scale:
|
|
67
|
+
|
|
68
|
+
`bin/rails generate model product 'price:decimal{10,2}'`
|
|
69
|
+
|
|
70
|
+
You can add a `:uniq` or `:index` suffix for unique or standard indexes
|
|
71
|
+
respectively:
|
|
72
|
+
|
|
73
|
+
`bin/rails generate model user pseudo:string:uniq`
|
|
74
|
+
`bin/rails generate model user pseudo:string:index`
|
|
75
|
+
|
|
76
|
+
You can combine any single curly brace option with the index options:
|
|
77
|
+
|
|
78
|
+
`bin/rails generate model user username:string{30}:uniq`
|
|
79
|
+
`bin/rails generate model product supplier:references{polymorphic}:index`
|
|
80
|
+
|
|
81
|
+
If you require a `password_digest` string column for use with
|
|
82
|
+
has_secure_password, you can specify `password:digest`:
|
|
83
|
+
|
|
84
|
+
`bin/rails generate model user password:digest`
|
|
85
|
+
|
|
86
|
+
If you require a `token` string column for use with
|
|
87
|
+
has_secure_token, you can specify `auth_token:token`:
|
|
88
|
+
|
|
89
|
+
`bin/rails generate model user auth_token:token`
|
|
90
|
+
|
|
91
|
+
Examples:
|
|
92
|
+
`bin/rails generate model account`
|
|
93
|
+
|
|
94
|
+
For Active Record and TestUnit it creates:
|
|
95
|
+
|
|
96
|
+
Model: app/models/account.rb
|
|
97
|
+
Test: test/models/account_test.rb
|
|
98
|
+
Fixtures: test/fixtures/accounts.yml
|
|
99
|
+
Migration: db/migrate/XXX_create_accounts.rb
|
|
100
|
+
|
|
101
|
+
`bin/rails generate model post title:string body:text published:boolean`
|
|
102
|
+
|
|
103
|
+
Creates a Post model with a string title, text body, and published flag.
|
|
104
|
+
|
|
105
|
+
`bin/rails generate model admin/account`
|
|
106
|
+
|
|
107
|
+
For Active Record and TestUnit it creates:
|
|
108
|
+
|
|
109
|
+
Module: app/models/admin.rb
|
|
110
|
+
Model: app/models/admin/account.rb
|
|
111
|
+
Test: test/models/admin/account_test.rb
|
|
112
|
+
Fixtures: test/fixtures/admin/accounts.yml
|
|
113
|
+
Migration: db/migrate/XXX_create_admin_accounts.rb
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails/generators/active_record"
|
|
4
|
+
|
|
5
|
+
module ActiveRecord
|
|
6
|
+
module Generators # :nodoc:
|
|
7
|
+
class ModelGenerator < Base # :nodoc:
|
|
8
|
+
argument :attributes, type: :array, default: [], banner: "field[:type][:index] field[:type][:index]"
|
|
9
|
+
|
|
10
|
+
check_class_collision
|
|
11
|
+
|
|
12
|
+
class_option :migration, type: :boolean
|
|
13
|
+
class_option :timestamps, type: :boolean
|
|
14
|
+
class_option :parent, type: :string, default: "ApplicationRecord", desc: "The parent class for the generated model"
|
|
15
|
+
class_option :indexes, type: :boolean, default: true, desc: "Add indexes for references and belongs_to columns"
|
|
16
|
+
class_option :primary_key_type, type: :string, desc: "The type for primary key"
|
|
17
|
+
class_option :database, type: :string, aliases: %i(--db), desc: "The database for your model's migration. By default, the current environment's primary database is used."
|
|
18
|
+
|
|
19
|
+
Rails::Generators.templates_path.each do |path|
|
|
20
|
+
source_paths << File.join(path, base_name, "migration")
|
|
21
|
+
end
|
|
22
|
+
source_paths << File.expand_path(File.join(base_name, "migration", "templates"), base_root)
|
|
23
|
+
|
|
24
|
+
# creates the migration file for the model.
|
|
25
|
+
def create_migration_file
|
|
26
|
+
return if skip_migration_creation?
|
|
27
|
+
attributes.each { |a| a.attr_options.delete(:index) if a.reference? && !a.has_index? } if options[:indexes] == false
|
|
28
|
+
migration_template "create_table_migration.rb", File.join(db_migrate_path, "create_#{table_name}.rb")
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def create_model_file
|
|
32
|
+
generate_abstract_class if database && !custom_parent?
|
|
33
|
+
template "model.rb", File.join("app/models", class_path, "#{file_name}.rb")
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def create_module_file
|
|
37
|
+
return if regular_class_path.empty?
|
|
38
|
+
template "module.rb", File.join("app/models", "#{class_path.join('/')}.rb") if behavior == :invoke
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
hook_for :test_framework
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
# Skip creating migration file if:
|
|
45
|
+
# - options parent is present and database option is not present
|
|
46
|
+
# - migrations option is nil or false
|
|
47
|
+
def skip_migration_creation?
|
|
48
|
+
custom_parent? && !database || !migration
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def attributes_with_index
|
|
52
|
+
attributes.select { |a| !a.reference? && a.has_index? }
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Used by the migration template to determine the parent name of the model
|
|
56
|
+
def parent_class_name
|
|
57
|
+
if custom_parent?
|
|
58
|
+
parent
|
|
59
|
+
elsif database
|
|
60
|
+
abstract_class_name
|
|
61
|
+
else
|
|
62
|
+
parent
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def generate_abstract_class
|
|
67
|
+
path = File.join("app/models", "#{database.underscore}_record.rb")
|
|
68
|
+
return if File.exist?(path)
|
|
69
|
+
|
|
70
|
+
template "abstract_base_class.rb", path
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def abstract_class_name
|
|
74
|
+
"#{database.camelize}Record"
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def database
|
|
78
|
+
options[:database]
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def parent
|
|
82
|
+
options[:parent]
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def custom_parent?
|
|
86
|
+
parent != self.class.class_options[:parent].default
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def migration
|
|
90
|
+
options[:migration]
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<% module_namespacing do -%>
|
|
2
|
+
class <%= class_name %> < <%= parent_class_name.classify %>
|
|
3
|
+
<% attributes.select(&:reference?).each do |attribute| -%>
|
|
4
|
+
belongs_to :<%= attribute.name %><%= ", polymorphic: true" if attribute.polymorphic? %>
|
|
5
|
+
<% end -%>
|
|
6
|
+
<% attributes.select(&:rich_text?).each do |attribute| -%>
|
|
7
|
+
has_rich_text :<%= attribute.name %>
|
|
8
|
+
<% end -%>
|
|
9
|
+
<% attributes.select(&:attachment?).each do |attribute| -%>
|
|
10
|
+
has_one_attached :<%= attribute.name %>
|
|
11
|
+
<% end -%>
|
|
12
|
+
<% attributes.select(&:attachments?).each do |attribute| -%>
|
|
13
|
+
has_many_attached :<%= attribute.name %>
|
|
14
|
+
<% end -%>
|
|
15
|
+
<% attributes.select(&:token?).each do |attribute| -%>
|
|
16
|
+
has_secure_token<% if attribute.name != "token" %> :<%= attribute.name %><% end %>
|
|
17
|
+
<% end -%>
|
|
18
|
+
<% if attributes.any?(&:password_digest?) -%>
|
|
19
|
+
has_secure_password
|
|
20
|
+
<% end -%>
|
|
21
|
+
end
|
|
22
|
+
<% end -%>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails/generators/active_record"
|
|
4
|
+
|
|
5
|
+
module ActiveRecord
|
|
6
|
+
module Generators # :nodoc:
|
|
7
|
+
class MultiDbGenerator < ::Rails::Generators::Base # :nodoc:
|
|
8
|
+
source_root File.expand_path("templates", __dir__)
|
|
9
|
+
|
|
10
|
+
def create_multi_db
|
|
11
|
+
filename = "multi_db.rb"
|
|
12
|
+
template filename, "config/initializers/#{filename}"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|