activerecord 5.0.7.2 → 6.0.6.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +844 -1944
- data/MIT-LICENSE +3 -1
- data/README.rdoc +9 -7
- data/examples/performance.rb +31 -29
- data/examples/simple.rb +5 -3
- data/lib/active_record/advisory_lock_base.rb +18 -0
- data/lib/active_record/aggregations.rb +249 -247
- data/lib/active_record/association_relation.rb +18 -14
- data/lib/active_record/associations/alias_tracker.rb +24 -34
- data/lib/active_record/associations/association.rb +113 -55
- data/lib/active_record/associations/association_scope.rb +102 -96
- data/lib/active_record/associations/belongs_to_association.rb +58 -42
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
- data/lib/active_record/associations/builder/association.rb +18 -25
- data/lib/active_record/associations/builder/belongs_to.rb +43 -54
- data/lib/active_record/associations/builder/collection_association.rb +7 -18
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +41 -62
- data/lib/active_record/associations/builder/has_many.rb +4 -0
- data/lib/active_record/associations/builder/has_one.rb +37 -1
- data/lib/active_record/associations/builder/singular_association.rb +4 -0
- data/lib/active_record/associations/collection_association.rb +93 -254
- data/lib/active_record/associations/collection_proxy.rb +159 -122
- data/lib/active_record/associations/foreign_association.rb +9 -0
- data/lib/active_record/associations/has_many_association.rb +23 -30
- data/lib/active_record/associations/has_many_through_association.rb +58 -44
- data/lib/active_record/associations/has_one_association.rb +59 -54
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency/join_association.rb +43 -85
- data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
- data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
- data/lib/active_record/associations/join_dependency.rb +152 -177
- data/lib/active_record/associations/preloader/association.rb +101 -97
- data/lib/active_record/associations/preloader/through_association.rb +77 -76
- data/lib/active_record/associations/preloader.rb +94 -103
- data/lib/active_record/associations/singular_association.rb +12 -45
- data/lib/active_record/associations/through_association.rb +27 -15
- data/lib/active_record/associations.rb +1603 -1592
- data/lib/active_record/attribute_assignment.rb +54 -61
- data/lib/active_record/attribute_decorators.rb +38 -17
- data/lib/active_record/attribute_methods/before_type_cast.rb +12 -8
- data/lib/active_record/attribute_methods/dirty.rb +179 -109
- data/lib/active_record/attribute_methods/primary_key.rb +85 -92
- data/lib/active_record/attribute_methods/query.rb +4 -3
- data/lib/active_record/attribute_methods/read.rb +20 -49
- data/lib/active_record/attribute_methods/serialization.rb +29 -7
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -66
- data/lib/active_record/attribute_methods/write.rb +34 -33
- data/lib/active_record/attribute_methods.rb +66 -106
- data/lib/active_record/attributes.rb +38 -25
- data/lib/active_record/autosave_association.rb +58 -39
- data/lib/active_record/base.rb +27 -24
- data/lib/active_record/callbacks.rb +64 -35
- data/lib/active_record/coders/json.rb +2 -0
- data/lib/active_record/coders/yaml_column.rb +34 -13
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +558 -323
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +215 -94
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -35
- data/lib/active_record/connection_adapters/abstract/quoting.rb +128 -75
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -28
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +233 -147
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +400 -213
- data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -79
- data/lib/active_record/connection_adapters/abstract_adapter.rb +373 -202
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +401 -562
- data/lib/active_record/connection_adapters/column.rb +41 -13
- data/lib/active_record/connection_adapters/connection_specification.rb +172 -139
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
- data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +137 -49
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
- data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +48 -30
- data/lib/active_record/connection_adapters/postgresql/column.rb +19 -31
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -54
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +12 -2
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
- data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -30
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +8 -4
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +20 -26
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +378 -308
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
- data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +383 -275
- data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +261 -267
- data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
- data/lib/active_record/connection_handling.rb +143 -40
- data/lib/active_record/core.rb +207 -160
- data/lib/active_record/counter_cache.rb +60 -28
- data/lib/active_record/database_configurations/database_config.rb +37 -0
- data/lib/active_record/database_configurations/hash_config.rb +50 -0
- data/lib/active_record/database_configurations/url_config.rb +78 -0
- data/lib/active_record/database_configurations.rb +233 -0
- data/lib/active_record/define_callbacks.rb +22 -0
- data/lib/active_record/dynamic_matchers.rb +87 -87
- data/lib/active_record/enum.rb +67 -23
- data/lib/active_record/errors.rb +114 -18
- data/lib/active_record/explain.rb +4 -4
- data/lib/active_record/explain_registry.rb +3 -1
- data/lib/active_record/explain_subscriber.rb +9 -4
- data/lib/active_record/fixture_set/file.rb +13 -8
- data/lib/active_record/fixture_set/model_metadata.rb +33 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +152 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +194 -504
- data/lib/active_record/gem_version.rb +5 -3
- data/lib/active_record/inheritance.rb +150 -99
- data/lib/active_record/insert_all.rb +179 -0
- data/lib/active_record/integration.rb +116 -25
- data/lib/active_record/internal_metadata.rb +16 -19
- data/lib/active_record/legacy_yaml_adapter.rb +4 -2
- data/lib/active_record/locking/optimistic.rb +85 -86
- data/lib/active_record/locking/pessimistic.rb +18 -6
- data/lib/active_record/log_subscriber.rb +48 -29
- data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
- data/lib/active_record/middleware/database_selector.rb +74 -0
- data/lib/active_record/migration/command_recorder.rb +134 -100
- data/lib/active_record/migration/compatibility.rb +174 -56
- data/lib/active_record/migration/join_table.rb +8 -7
- data/lib/active_record/migration.rb +369 -302
- data/lib/active_record/model_schema.rb +160 -127
- data/lib/active_record/nested_attributes.rb +213 -202
- data/lib/active_record/no_touching.rb +12 -3
- data/lib/active_record/null_relation.rb +12 -34
- data/lib/active_record/persistence.rb +446 -77
- data/lib/active_record/query_cache.rb +13 -12
- data/lib/active_record/querying.rb +37 -24
- data/lib/active_record/railtie.rb +128 -36
- data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
- data/lib/active_record/railties/console_sandbox.rb +2 -0
- data/lib/active_record/railties/controller_runtime.rb +34 -33
- data/lib/active_record/railties/databases.rake +312 -177
- data/lib/active_record/readonly_attributes.rb +5 -4
- data/lib/active_record/reflection.rb +214 -254
- data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
- data/lib/active_record/relation/batches.rb +98 -52
- data/lib/active_record/relation/calculations.rb +212 -173
- data/lib/active_record/relation/delegation.rb +73 -69
- data/lib/active_record/relation/finder_methods.rb +207 -247
- data/lib/active_record/relation/from_clause.rb +6 -8
- data/lib/active_record/relation/merger.rb +82 -61
- data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
- data/lib/active_record/relation/predicate_builder.rb +83 -105
- data/lib/active_record/relation/query_attribute.rb +33 -2
- data/lib/active_record/relation/query_methods.rb +488 -332
- data/lib/active_record/relation/record_fetch_warning.rb +5 -3
- data/lib/active_record/relation/spawn_methods.rb +8 -8
- data/lib/active_record/relation/where_clause.rb +111 -96
- data/lib/active_record/relation/where_clause_factory.rb +6 -11
- data/lib/active_record/relation.rb +443 -318
- data/lib/active_record/result.rb +69 -40
- data/lib/active_record/runtime_registry.rb +5 -3
- data/lib/active_record/sanitization.rb +83 -99
- data/lib/active_record/schema.rb +7 -14
- data/lib/active_record/schema_dumper.rb +71 -69
- data/lib/active_record/schema_migration.rb +16 -6
- data/lib/active_record/scoping/default.rb +92 -95
- data/lib/active_record/scoping/named.rb +51 -26
- data/lib/active_record/scoping.rb +20 -20
- data/lib/active_record/secure_token.rb +4 -2
- data/lib/active_record/serialization.rb +2 -0
- data/lib/active_record/statement_cache.rb +63 -28
- data/lib/active_record/store.rb +121 -41
- data/lib/active_record/suppressor.rb +6 -3
- data/lib/active_record/table_metadata.rb +39 -18
- data/lib/active_record/tasks/database_tasks.rb +271 -81
- data/lib/active_record/tasks/mysql_database_tasks.rb +54 -91
- data/lib/active_record/tasks/postgresql_database_tasks.rb +77 -47
- data/lib/active_record/tasks/sqlite_database_tasks.rb +33 -16
- data/lib/active_record/test_databases.rb +23 -0
- data/lib/active_record/test_fixtures.rb +243 -0
- data/lib/active_record/timestamp.rb +70 -36
- data/lib/active_record/touch_later.rb +8 -6
- data/lib/active_record/transactions.rb +141 -157
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type/adapter_specific_registry.rb +44 -48
- data/lib/active_record/type/date.rb +2 -0
- data/lib/active_record/type/date_time.rb +2 -0
- data/lib/active_record/type/decimal_without_scale.rb +15 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
- data/lib/active_record/type/internal/timezone.rb +2 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +16 -9
- data/lib/active_record/type/text.rb +11 -0
- data/lib/active_record/type/time.rb +12 -1
- data/lib/active_record/type/type_map.rb +14 -17
- data/lib/active_record/type/unsigned_integer.rb +16 -0
- data/lib/active_record/type.rb +23 -18
- data/lib/active_record/type_caster/connection.rb +17 -12
- data/lib/active_record/type_caster/map.rb +5 -4
- data/lib/active_record/type_caster.rb +4 -2
- data/lib/active_record/validations/absence.rb +2 -0
- data/lib/active_record/validations/associated.rb +3 -2
- data/lib/active_record/validations/length.rb +2 -0
- data/lib/active_record/validations/presence.rb +4 -2
- data/lib/active_record/validations/uniqueness.rb +29 -42
- data/lib/active_record/validations.rb +7 -5
- data/lib/active_record/version.rb +3 -1
- data/lib/active_record.rb +37 -22
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +37 -0
- data/lib/arel/attributes.rb +22 -0
- data/lib/arel/collectors/bind.rb +24 -0
- data/lib/arel/collectors/composite.rb +31 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +20 -0
- data/lib/arel/collectors/substitute_binds.rb +28 -0
- data/lib/arel/crud.rb +42 -0
- data/lib/arel/delete_manager.rb +18 -0
- data/lib/arel/errors.rb +9 -0
- data/lib/arel/expressions.rb +29 -0
- data/lib/arel/factory_methods.rb +49 -0
- data/lib/arel/insert_manager.rb +49 -0
- data/lib/arel/math.rb +45 -0
- data/lib/arel/nodes/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +52 -0
- data/lib/arel/nodes/bind_param.rb +36 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +50 -0
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/delete_statement.rb +45 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +18 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +44 -0
- data/lib/arel/nodes/grouping.rb +8 -0
- data/lib/arel/nodes/in.rb +8 -0
- data/lib/arel/nodes/infix_operation.rb +80 -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/matches.rb +18 -0
- data/lib/arel/nodes/named_function.rb +23 -0
- data/lib/arel/nodes/node.rb +50 -0
- data/lib/arel/nodes/node_expression.rb +13 -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 +16 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +27 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +45 -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 +41 -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 +68 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +256 -0
- data/lib/arel/select_manager.rb +271 -0
- data/lib/arel/table.rb +110 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors/depth_first.rb +203 -0
- data/lib/arel/visitors/dot.rb +296 -0
- data/lib/arel/visitors/ibm_db.rb +34 -0
- data/lib/arel/visitors/informix.rb +62 -0
- data/lib/arel/visitors/mssql.rb +156 -0
- data/lib/arel/visitors/mysql.rb +83 -0
- data/lib/arel/visitors/oracle.rb +158 -0
- data/lib/arel/visitors/oracle12.rb +65 -0
- data/lib/arel/visitors/postgresql.rb +109 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +888 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors/where_sql.rb +22 -0
- data/lib/arel/visitors.rb +20 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +62 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -35
- data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +1 -1
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +4 -2
- data/lib/rails/generators/active_record/migration.rb +17 -3
- data/lib/rails/generators/active_record/model/model_generator.rb +9 -30
- data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
- data/lib/rails/generators/active_record.rb +7 -5
- metadata +138 -52
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -17
- data/lib/active_record/associations/preloader/has_many.rb +0 -17
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
- data/lib/active_record/associations/preloader/has_one.rb +0 -15
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -20
- data/lib/active_record/attribute/user_provided_default.rb +0 -28
- data/lib/active_record/attribute.rb +0 -213
- data/lib/active_record/attribute_mutation_tracker.rb +0 -70
- data/lib/active_record/attribute_set/builder.rb +0 -132
- data/lib/active_record/attribute_set.rb +0 -110
- data/lib/active_record/collection_cache_key.rb +0 -50
- data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
- data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
- data/lib/active_record/type/internal/abstract_json.rb +0 -33
- /data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
- /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,32 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
module ConnectionAdapters #:nodoc:
|
3
5
|
# Abstract representation of an index definition on a table. Instances of
|
4
6
|
# this type are typically created and returned by methods in database
|
5
|
-
# adapters. e.g. ActiveRecord::ConnectionAdapters::
|
6
|
-
class IndexDefinition
|
7
|
+
# adapters. e.g. ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#indexes
|
8
|
+
class IndexDefinition # :nodoc:
|
9
|
+
attr_reader :table, :name, :unique, :columns, :lengths, :orders, :opclasses, :where, :type, :using, :comment
|
10
|
+
|
11
|
+
def initialize(
|
12
|
+
table, name,
|
13
|
+
unique = false,
|
14
|
+
columns = [],
|
15
|
+
lengths: {},
|
16
|
+
orders: {},
|
17
|
+
opclasses: {},
|
18
|
+
where: nil,
|
19
|
+
type: nil,
|
20
|
+
using: nil,
|
21
|
+
comment: nil
|
22
|
+
)
|
23
|
+
@table = table
|
24
|
+
@name = name
|
25
|
+
@unique = unique
|
26
|
+
@columns = columns
|
27
|
+
@lengths = concise_options(lengths)
|
28
|
+
@orders = concise_options(orders)
|
29
|
+
@opclasses = concise_options(opclasses)
|
30
|
+
@where = where
|
31
|
+
@type = type
|
32
|
+
@using = using
|
33
|
+
@comment = comment
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def concise_options(options)
|
38
|
+
if columns.size == options.size && options.values.uniq.size == 1
|
39
|
+
options.values.first
|
40
|
+
else
|
41
|
+
options
|
42
|
+
end
|
43
|
+
end
|
7
44
|
end
|
8
45
|
|
9
46
|
# Abstract representation of a column definition. Instances of this type
|
10
47
|
# are typically created by methods in TableDefinition, and added to the
|
11
48
|
# +columns+ attribute of said TableDefinition object, in order to be used
|
12
49
|
# for generating a number of table creation or table changing SQL statements.
|
13
|
-
|
14
|
-
|
50
|
+
ColumnDefinition = Struct.new(:name, :type, :options, :sql_type) do # :nodoc:
|
15
51
|
def primary_key?
|
16
|
-
|
52
|
+
options[:primary_key]
|
17
53
|
end
|
18
|
-
end
|
19
54
|
|
20
|
-
|
21
|
-
|
55
|
+
[:limit, :precision, :scale, :default, :null, :collation, :comment].each do |option_name|
|
56
|
+
module_eval <<-CODE, __FILE__, __LINE__ + 1
|
57
|
+
def #{option_name}
|
58
|
+
options[:#{option_name}]
|
59
|
+
end
|
22
60
|
|
23
|
-
|
24
|
-
|
61
|
+
def #{option_name}=(value)
|
62
|
+
options[:#{option_name}] = value
|
63
|
+
end
|
64
|
+
CODE
|
65
|
+
end
|
25
66
|
|
26
|
-
|
67
|
+
def aliased_types(name, fallback)
|
68
|
+
"timestamp" == name ? :datetime : fallback
|
69
|
+
end
|
27
70
|
end
|
28
71
|
|
29
|
-
|
72
|
+
AddColumnDefinition = Struct.new(:column) # :nodoc:
|
73
|
+
|
74
|
+
ChangeColumnDefinition = Struct.new(:column, :name) #:nodoc:
|
75
|
+
|
76
|
+
PrimaryKeyDefinition = Struct.new(:name) # :nodoc:
|
77
|
+
|
78
|
+
ForeignKeyDefinition = Struct.new(:from_table, :to_table, :options) do #:nodoc:
|
30
79
|
def name
|
31
80
|
options[:name]
|
32
81
|
end
|
@@ -51,19 +100,25 @@ module ActiveRecord
|
|
51
100
|
options[:primary_key] != default_primary_key
|
52
101
|
end
|
53
102
|
|
54
|
-
def
|
55
|
-
|
56
|
-
self.to_table == to_table_ord.to_s
|
57
|
-
else
|
58
|
-
(to_table.nil? || to_table.to_s == self.to_table) &&
|
59
|
-
options.all? { |k, v| self.options[k].to_s == v.to_s }
|
60
|
-
end
|
103
|
+
def validate?
|
104
|
+
options.fetch(:validate, true)
|
61
105
|
end
|
106
|
+
alias validated? validate?
|
62
107
|
|
63
|
-
|
64
|
-
|
65
|
-
|
108
|
+
def export_name_on_schema_dump?
|
109
|
+
!ActiveRecord::SchemaDumper.fk_ignore_pattern.match?(name) if name
|
110
|
+
end
|
111
|
+
|
112
|
+
def defined_for?(to_table: nil, validate: nil, **options)
|
113
|
+
(to_table.nil? || to_table.to_s == self.to_table) &&
|
114
|
+
(validate.nil? || validate == options.fetch(:validate, validate)) &&
|
115
|
+
options.all? { |k, v| self.options[k].to_s == v.to_s }
|
66
116
|
end
|
117
|
+
|
118
|
+
private
|
119
|
+
def default_primary_key
|
120
|
+
"id"
|
121
|
+
end
|
67
122
|
end
|
68
123
|
|
69
124
|
class ReferenceDefinition # :nodoc:
|
@@ -72,7 +127,7 @@ module ActiveRecord
|
|
72
127
|
polymorphic: false,
|
73
128
|
index: true,
|
74
129
|
foreign_key: false,
|
75
|
-
type: :
|
130
|
+
type: :bigint,
|
76
131
|
**options
|
77
132
|
)
|
78
133
|
@name = name
|
@@ -89,7 +144,8 @@ module ActiveRecord
|
|
89
144
|
|
90
145
|
def add_to(table)
|
91
146
|
columns.each do |column_options|
|
92
|
-
|
147
|
+
kwargs = column_options.extract_options!
|
148
|
+
table.column(*column_options, **kwargs)
|
93
149
|
end
|
94
150
|
|
95
151
|
if index
|
@@ -97,89 +153,91 @@ module ActiveRecord
|
|
97
153
|
end
|
98
154
|
|
99
155
|
if foreign_key
|
100
|
-
table.foreign_key(foreign_table_name, foreign_key_options)
|
156
|
+
table.foreign_key(foreign_table_name, **foreign_key_options)
|
101
157
|
end
|
102
158
|
end
|
103
159
|
|
104
|
-
protected
|
105
|
-
|
106
|
-
attr_reader :name, :polymorphic, :index, :foreign_key, :type, :options
|
107
|
-
|
108
160
|
private
|
161
|
+
attr_reader :name, :polymorphic, :index, :foreign_key, :type, :options
|
109
162
|
|
110
|
-
|
111
|
-
|
112
|
-
|
163
|
+
def as_options(value)
|
164
|
+
value.is_a?(Hash) ? value : {}
|
165
|
+
end
|
113
166
|
|
114
|
-
|
115
|
-
|
116
|
-
|
167
|
+
def polymorphic_options
|
168
|
+
as_options(polymorphic).merge(options.slice(:null, :first, :after))
|
169
|
+
end
|
117
170
|
|
118
|
-
|
119
|
-
|
120
|
-
|
171
|
+
def index_options
|
172
|
+
as_options(index)
|
173
|
+
end
|
121
174
|
|
122
|
-
|
123
|
-
|
124
|
-
|
175
|
+
def foreign_key_options
|
176
|
+
as_options(foreign_key).merge(column: column_name)
|
177
|
+
end
|
125
178
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
179
|
+
def columns
|
180
|
+
result = [[column_name, type, options]]
|
181
|
+
if polymorphic
|
182
|
+
result.unshift(["#{name}_type", :string, polymorphic_options])
|
183
|
+
end
|
184
|
+
result
|
130
185
|
end
|
131
|
-
result
|
132
|
-
end
|
133
186
|
|
134
|
-
|
135
|
-
|
136
|
-
|
187
|
+
def column_name
|
188
|
+
"#{name}_id"
|
189
|
+
end
|
137
190
|
|
138
|
-
|
139
|
-
|
140
|
-
|
191
|
+
def column_names
|
192
|
+
columns.map(&:first)
|
193
|
+
end
|
141
194
|
|
142
|
-
|
143
|
-
|
144
|
-
|
195
|
+
def foreign_table_name
|
196
|
+
foreign_key_options.fetch(:to_table) do
|
197
|
+
Base.pluralize_table_names ? name.to_s.pluralize : name
|
198
|
+
end
|
145
199
|
end
|
146
|
-
end
|
147
200
|
end
|
148
201
|
|
149
202
|
module ColumnMethods
|
203
|
+
extend ActiveSupport::Concern
|
204
|
+
|
150
205
|
# Appends a primary key definition to the table definition.
|
151
206
|
# Can be called multiple times, but this is probably not a good idea.
|
152
207
|
def primary_key(name, type = :primary_key, **options)
|
153
|
-
column(name, type, options.merge(primary_key: true))
|
208
|
+
column(name, type, **options.merge(primary_key: true))
|
154
209
|
end
|
155
210
|
|
211
|
+
##
|
212
|
+
# :method: column
|
213
|
+
# :call-seq: column(name, type, **options)
|
214
|
+
#
|
156
215
|
# Appends a column or columns of a specified type.
|
157
216
|
#
|
158
217
|
# t.string(:goat)
|
159
218
|
# t.string(:goat, :sheep)
|
160
219
|
#
|
161
220
|
# See TableDefinition#column
|
162
|
-
|
163
|
-
|
164
|
-
:binary,
|
165
|
-
|
166
|
-
|
167
|
-
:
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
:
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
221
|
+
|
222
|
+
included do
|
223
|
+
define_column_methods :bigint, :binary, :boolean, :date, :datetime, :decimal,
|
224
|
+
:float, :integer, :json, :string, :text, :time, :timestamp, :virtual
|
225
|
+
|
226
|
+
alias :numeric :decimal
|
227
|
+
end
|
228
|
+
|
229
|
+
class_methods do
|
230
|
+
private def define_column_methods(*column_types) # :nodoc:
|
231
|
+
column_types.each do |column_type|
|
232
|
+
module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
233
|
+
def #{column_type}(*names, **options)
|
234
|
+
raise ArgumentError, "Missing column name(s) for #{column_type}" if names.empty?
|
235
|
+
names.each { |name| column(name, :#{column_type}, **options) }
|
236
|
+
end
|
237
|
+
RUBY
|
179
238
|
end
|
180
|
-
|
239
|
+
end
|
181
240
|
end
|
182
|
-
alias_method :numeric, :decimal
|
183
241
|
end
|
184
242
|
|
185
243
|
# Represents the schema of an SQL table in an abstract way. This class
|
@@ -203,15 +261,25 @@ module ActiveRecord
|
|
203
261
|
class TableDefinition
|
204
262
|
include ColumnMethods
|
205
263
|
|
206
|
-
|
207
|
-
attr_reader :name, :temporary, :options, :as, :foreign_keys, :comment
|
264
|
+
attr_reader :name, :temporary, :if_not_exists, :options, :as, :comment, :indexes, :foreign_keys
|
208
265
|
|
209
|
-
def initialize(
|
266
|
+
def initialize(
|
267
|
+
conn,
|
268
|
+
name,
|
269
|
+
temporary: false,
|
270
|
+
if_not_exists: false,
|
271
|
+
options: nil,
|
272
|
+
as: nil,
|
273
|
+
comment: nil,
|
274
|
+
**
|
275
|
+
)
|
276
|
+
@conn = conn
|
210
277
|
@columns_hash = {}
|
211
278
|
@indexes = []
|
212
279
|
@foreign_keys = []
|
213
280
|
@primary_keys = nil
|
214
281
|
@temporary = temporary
|
282
|
+
@if_not_exists = if_not_exists
|
215
283
|
@options = options
|
216
284
|
@as = as
|
217
285
|
@name = name
|
@@ -295,21 +363,24 @@ module ActiveRecord
|
|
295
363
|
#
|
296
364
|
# create_table :taggings do |t|
|
297
365
|
# t.references :tag, index: { name: 'index_taggings_on_tag_id' }
|
298
|
-
# t.references :tagger, polymorphic: true
|
299
|
-
# t.references :taggable, polymorphic: { default: 'Photo' }
|
366
|
+
# t.references :tagger, polymorphic: true
|
367
|
+
# t.references :taggable, polymorphic: { default: 'Photo' }, index: false
|
300
368
|
# end
|
301
|
-
def column(name, type, options
|
369
|
+
def column(name, type, **options)
|
302
370
|
name = name.to_s
|
303
371
|
type = type.to_sym if type
|
304
|
-
options = options.dup
|
305
372
|
|
306
|
-
if @columns_hash[name]
|
307
|
-
|
373
|
+
if @columns_hash[name]
|
374
|
+
if @columns_hash[name].primary_key?
|
375
|
+
raise ArgumentError, "you can't redefine the primary key column '#{name}'. To define a custom primary key, pass { id: false } to create_table."
|
376
|
+
else
|
377
|
+
raise ArgumentError, "you can't define an already defined column '#{name}'."
|
378
|
+
end
|
308
379
|
end
|
309
380
|
|
310
381
|
index_options = options.delete(:index)
|
311
382
|
index(name, index_options.is_a?(Hash) ? index_options : {}) if index_options
|
312
|
-
@columns_hash[name] = new_column_definition(name, type, options)
|
383
|
+
@columns_hash[name] = new_column_definition(name, type, **options)
|
313
384
|
self
|
314
385
|
end
|
315
386
|
|
@@ -327,65 +398,65 @@ module ActiveRecord
|
|
327
398
|
indexes << [column_name, options]
|
328
399
|
end
|
329
400
|
|
330
|
-
def foreign_key(table_name, options
|
331
|
-
|
332
|
-
table_name_suffix = ActiveRecord::Base.table_name_suffix
|
333
|
-
table_name = "#{table_name_prefix}#{table_name}#{table_name_suffix}"
|
334
|
-
foreign_keys.push([table_name, options])
|
401
|
+
def foreign_key(table_name, **options) # :nodoc:
|
402
|
+
foreign_keys << [table_name, options]
|
335
403
|
end
|
336
404
|
|
337
405
|
# Appends <tt>:datetime</tt> columns <tt>:created_at</tt> and
|
338
406
|
# <tt>:updated_at</tt> to the table. See {connection.add_timestamps}[rdoc-ref:SchemaStatements#add_timestamps]
|
339
407
|
#
|
340
408
|
# t.timestamps null: false
|
341
|
-
def timestamps(
|
342
|
-
options = args.extract_options!
|
343
|
-
|
409
|
+
def timestamps(**options)
|
344
410
|
options[:null] = false if options[:null].nil?
|
345
411
|
|
346
|
-
|
347
|
-
|
412
|
+
if !options.key?(:precision) && @conn.supports_datetime_with_precision?
|
413
|
+
options[:precision] = 6
|
414
|
+
end
|
415
|
+
|
416
|
+
column(:created_at, :datetime, **options)
|
417
|
+
column(:updated_at, :datetime, **options)
|
348
418
|
end
|
349
419
|
|
350
420
|
# Adds a reference.
|
351
421
|
#
|
352
422
|
# t.references(:user)
|
353
423
|
# t.belongs_to(:supplier, foreign_key: true)
|
424
|
+
# t.belongs_to(:supplier, foreign_key: true, type: :integer)
|
354
425
|
#
|
355
426
|
# See {connection.add_reference}[rdoc-ref:SchemaStatements#add_reference] for details of the options you can use.
|
356
427
|
def references(*args, **options)
|
357
|
-
args.each do |
|
358
|
-
ReferenceDefinition.new(
|
428
|
+
args.each do |ref_name|
|
429
|
+
ReferenceDefinition.new(ref_name, **options).add_to(self)
|
359
430
|
end
|
360
431
|
end
|
361
432
|
alias :belongs_to :references
|
362
433
|
|
363
|
-
def new_column_definition(name, type, options) # :nodoc:
|
434
|
+
def new_column_definition(name, type, **options) # :nodoc:
|
435
|
+
if integer_like_primary_key?(type, options)
|
436
|
+
type = integer_like_primary_key_type(type, options)
|
437
|
+
end
|
364
438
|
type = aliased_types(type.to_s, type)
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
column.precision = options[:precision]
|
369
|
-
column.scale = options[:scale]
|
370
|
-
column.default = options[:default]
|
371
|
-
column.null = options[:null]
|
372
|
-
column.first = options[:first]
|
373
|
-
column.after = options[:after]
|
374
|
-
column.auto_increment = options[:auto_increment]
|
375
|
-
column.primary_key = type == :primary_key || options[:primary_key]
|
376
|
-
column.collation = options[:collation]
|
377
|
-
column.comment = options[:comment]
|
378
|
-
column
|
439
|
+
options[:primary_key] ||= type == :primary_key
|
440
|
+
options[:null] = false if options[:primary_key]
|
441
|
+
create_column_definition(name, type, options)
|
379
442
|
end
|
380
443
|
|
381
444
|
private
|
382
|
-
|
383
|
-
|
384
|
-
|
445
|
+
def create_column_definition(name, type, options)
|
446
|
+
ColumnDefinition.new(name, type, options)
|
447
|
+
end
|
385
448
|
|
386
|
-
|
387
|
-
|
388
|
-
|
449
|
+
def aliased_types(name, fallback)
|
450
|
+
"timestamp" == name ? :datetime : fallback
|
451
|
+
end
|
452
|
+
|
453
|
+
def integer_like_primary_key?(type, options)
|
454
|
+
options[:primary_key] && [:integer, :bigint].include?(type) && !options.key?(:default)
|
455
|
+
end
|
456
|
+
|
457
|
+
def integer_like_primary_key_type(type, options)
|
458
|
+
type
|
459
|
+
end
|
389
460
|
end
|
390
461
|
|
391
462
|
class AlterTable # :nodoc:
|
@@ -410,10 +481,10 @@ module ActiveRecord
|
|
410
481
|
@foreign_key_drops << name
|
411
482
|
end
|
412
483
|
|
413
|
-
def add_column(name, type, options)
|
484
|
+
def add_column(name, type, **options)
|
414
485
|
name = name.to_s
|
415
486
|
type = type.to_sym
|
416
|
-
@adds << AddColumnDefinition.new(@td.new_column_definition(name, type, options))
|
487
|
+
@adds << AddColumnDefinition.new(@td.new_column_definition(name, type, **options))
|
417
488
|
end
|
418
489
|
end
|
419
490
|
|
@@ -446,7 +517,11 @@ module ActiveRecord
|
|
446
517
|
# t.date
|
447
518
|
# t.binary
|
448
519
|
# t.boolean
|
520
|
+
# t.foreign_key
|
521
|
+
# t.json
|
522
|
+
# t.virtual
|
449
523
|
# t.remove
|
524
|
+
# t.remove_foreign_key
|
450
525
|
# t.remove_references
|
451
526
|
# t.remove_belongs_to
|
452
527
|
# t.remove_index
|
@@ -468,17 +543,19 @@ module ActiveRecord
|
|
468
543
|
# t.column(:name, :string)
|
469
544
|
#
|
470
545
|
# See TableDefinition#column for details of the options you can use.
|
471
|
-
def column(column_name, type, options
|
472
|
-
|
546
|
+
def column(column_name, type, **options)
|
547
|
+
index_options = options.delete(:index)
|
548
|
+
@base.add_column(name, column_name, type, **options)
|
549
|
+
index(column_name, index_options.is_a?(Hash) ? index_options : {}) if index_options
|
473
550
|
end
|
474
551
|
|
475
552
|
# Checks to see if a column exists.
|
476
553
|
#
|
477
|
-
#
|
554
|
+
# t.string(:name) unless t.column_exists?(:name, :string)
|
478
555
|
#
|
479
556
|
# See {connection.column_exists?}[rdoc-ref:SchemaStatements#column_exists?]
|
480
|
-
def column_exists?(column_name, type = nil, options
|
481
|
-
@base.column_exists?(name, column_name, type, options)
|
557
|
+
def column_exists?(column_name, type = nil, **options)
|
558
|
+
@base.column_exists?(name, column_name, type, **options)
|
482
559
|
end
|
483
560
|
|
484
561
|
# Adds a new index to the table. +column_name+ can be a single Symbol, or
|
@@ -495,9 +572,9 @@ module ActiveRecord
|
|
495
572
|
|
496
573
|
# Checks to see if an index exists.
|
497
574
|
#
|
498
|
-
#
|
499
|
-
#
|
500
|
-
#
|
575
|
+
# unless t.index_exists?(:branch_id)
|
576
|
+
# t.index(:branch_id)
|
577
|
+
# end
|
501
578
|
#
|
502
579
|
# See {connection.index_exists?}[rdoc-ref:SchemaStatements#index_exists?]
|
503
580
|
def index_exists?(column_name, options = {})
|
@@ -518,8 +595,8 @@ module ActiveRecord
|
|
518
595
|
# t.timestamps(null: false)
|
519
596
|
#
|
520
597
|
# See {connection.add_timestamps}[rdoc-ref:SchemaStatements#add_timestamps]
|
521
|
-
def timestamps(options
|
522
|
-
@base.add_timestamps(name, options)
|
598
|
+
def timestamps(**options)
|
599
|
+
@base.add_timestamps(name, **options)
|
523
600
|
end
|
524
601
|
|
525
602
|
# Changes the column's definition according to the new options.
|
@@ -569,8 +646,8 @@ module ActiveRecord
|
|
569
646
|
# t.remove_timestamps
|
570
647
|
#
|
571
648
|
# See {connection.remove_timestamps}[rdoc-ref:SchemaStatements#remove_timestamps]
|
572
|
-
def remove_timestamps(options
|
573
|
-
@base.remove_timestamps(name, options)
|
649
|
+
def remove_timestamps(**options)
|
650
|
+
@base.remove_timestamps(name, **options)
|
574
651
|
end
|
575
652
|
|
576
653
|
# Renames a column.
|
@@ -588,10 +665,9 @@ module ActiveRecord
|
|
588
665
|
# t.belongs_to(:supplier, foreign_key: true)
|
589
666
|
#
|
590
667
|
# See {connection.add_reference}[rdoc-ref:SchemaStatements#add_reference] for details of the options you can use.
|
591
|
-
def references(*args)
|
592
|
-
options = args.extract_options!
|
668
|
+
def references(*args, **options)
|
593
669
|
args.each do |ref_name|
|
594
|
-
@base.add_reference(name, ref_name, options)
|
670
|
+
@base.add_reference(name, ref_name, **options)
|
595
671
|
end
|
596
672
|
end
|
597
673
|
alias :belongs_to :references
|
@@ -602,30 +678,40 @@ module ActiveRecord
|
|
602
678
|
# t.remove_belongs_to(:supplier, polymorphic: true)
|
603
679
|
#
|
604
680
|
# See {connection.remove_reference}[rdoc-ref:SchemaStatements#remove_reference]
|
605
|
-
def remove_references(*args)
|
606
|
-
options = args.extract_options!
|
681
|
+
def remove_references(*args, **options)
|
607
682
|
args.each do |ref_name|
|
608
|
-
@base.remove_reference(name, ref_name, options)
|
683
|
+
@base.remove_reference(name, ref_name, **options)
|
609
684
|
end
|
610
685
|
end
|
611
686
|
alias :remove_belongs_to :remove_references
|
612
687
|
|
613
|
-
# Adds a foreign key.
|
688
|
+
# Adds a foreign key to the table using a supplied table name.
|
614
689
|
#
|
615
|
-
#
|
690
|
+
# t.foreign_key(:authors)
|
691
|
+
# t.foreign_key(:authors, column: :author_id, primary_key: "id")
|
616
692
|
#
|
617
693
|
# See {connection.add_foreign_key}[rdoc-ref:SchemaStatements#add_foreign_key]
|
618
|
-
def foreign_key(*args)
|
619
|
-
@base.add_foreign_key(name, *args)
|
694
|
+
def foreign_key(*args, **options)
|
695
|
+
@base.add_foreign_key(name, *args, **options)
|
696
|
+
end
|
697
|
+
|
698
|
+
# Removes the given foreign key from the table.
|
699
|
+
#
|
700
|
+
# t.remove_foreign_key(:authors)
|
701
|
+
# t.remove_foreign_key(column: :author_id)
|
702
|
+
#
|
703
|
+
# See {connection.remove_foreign_key}[rdoc-ref:SchemaStatements#remove_foreign_key]
|
704
|
+
def remove_foreign_key(*args, **options)
|
705
|
+
@base.remove_foreign_key(name, *args, **options)
|
620
706
|
end
|
621
707
|
|
622
708
|
# Checks to see if a foreign key exists.
|
623
709
|
#
|
624
|
-
#
|
710
|
+
# t.foreign_key(:authors) unless t.foreign_key_exists?(:authors)
|
625
711
|
#
|
626
712
|
# See {connection.foreign_key_exists?}[rdoc-ref:SchemaStatements#foreign_key_exists?]
|
627
|
-
def foreign_key_exists?(*args)
|
628
|
-
@base.foreign_key_exists?(name, *args)
|
713
|
+
def foreign_key_exists?(*args, **options)
|
714
|
+
@base.foreign_key_exists?(name, *args, **options)
|
629
715
|
end
|
630
716
|
end
|
631
717
|
end
|