activerecord 5.1.5 → 5.2.1
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.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +450 -699
 - data/MIT-LICENSE +1 -1
 - data/README.rdoc +5 -5
 - data/examples/performance.rb +2 -0
 - data/examples/simple.rb +2 -0
 - data/lib/active_record/aggregations.rb +6 -5
 - data/lib/active_record/association_relation.rb +4 -2
 - data/lib/active_record/associations/alias_tracker.rb +19 -27
 - data/lib/active_record/associations/association.rb +33 -37
 - data/lib/active_record/associations/association_scope.rb +38 -50
 - data/lib/active_record/associations/belongs_to_association.rb +28 -9
 - data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -8
 - data/lib/active_record/associations/builder/association.rb +4 -7
 - data/lib/active_record/associations/builder/belongs_to.rb +14 -5
 - data/lib/active_record/associations/builder/collection_association.rb +1 -1
 - data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -1
 - data/lib/active_record/associations/builder/has_many.rb +2 -0
 - data/lib/active_record/associations/builder/has_one.rb +2 -0
 - data/lib/active_record/associations/builder/singular_association.rb +2 -0
 - data/lib/active_record/associations/collection_association.rb +52 -41
 - data/lib/active_record/associations/collection_proxy.rb +12 -15
 - data/lib/active_record/associations/foreign_association.rb +2 -0
 - data/lib/active_record/associations/has_many_association.rb +3 -1
 - data/lib/active_record/associations/has_many_through_association.rb +8 -19
 - data/lib/active_record/associations/has_one_association.rb +12 -1
 - data/lib/active_record/associations/has_one_through_association.rb +13 -8
 - data/lib/active_record/associations/join_dependency/join_association.rb +22 -67
 - data/lib/active_record/associations/join_dependency/join_base.rb +9 -8
 - data/lib/active_record/associations/join_dependency/join_part.rb +9 -9
 - data/lib/active_record/associations/join_dependency.rb +48 -93
 - data/lib/active_record/associations/preloader/association.rb +45 -61
 - data/lib/active_record/associations/preloader/through_association.rb +71 -79
 - data/lib/active_record/associations/preloader.rb +17 -37
 - data/lib/active_record/associations/singular_association.rb +14 -16
 - data/lib/active_record/associations/through_association.rb +26 -11
 - data/lib/active_record/associations.rb +40 -63
 - data/lib/active_record/attribute_assignment.rb +2 -5
 - data/lib/active_record/attribute_decorators.rb +3 -2
 - data/lib/active_record/attribute_methods/before_type_cast.rb +2 -0
 - data/lib/active_record/attribute_methods/dirty.rb +25 -214
 - data/lib/active_record/attribute_methods/primary_key.rb +7 -6
 - data/lib/active_record/attribute_methods/query.rb +2 -0
 - data/lib/active_record/attribute_methods/read.rb +9 -3
 - data/lib/active_record/attribute_methods/serialization.rb +23 -0
 - data/lib/active_record/attribute_methods/time_zone_conversion.rb +6 -8
 - data/lib/active_record/attribute_methods/write.rb +21 -9
 - data/lib/active_record/attribute_methods.rb +65 -24
 - data/lib/active_record/attributes.rb +7 -6
 - data/lib/active_record/autosave_association.rb +16 -14
 - data/lib/active_record/base.rb +2 -0
 - data/lib/active_record/callbacks.rb +12 -6
 - data/lib/active_record/coders/json.rb +2 -0
 - data/lib/active_record/coders/yaml_column.rb +2 -0
 - data/lib/active_record/collection_cache_key.rb +11 -7
 - data/lib/active_record/connection_adapters/abstract/connection_pool.rb +110 -35
 - data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -0
 - data/lib/active_record/connection_adapters/abstract/database_statements.rb +157 -29
 - data/lib/active_record/connection_adapters/abstract/query_cache.rb +7 -2
 - data/lib/active_record/connection_adapters/abstract/quoting.rb +15 -32
 - data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
 - data/lib/active_record/connection_adapters/abstract/schema_creation.rb +14 -5
 - data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +64 -6
 - data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +31 -53
 - data/lib/active_record/connection_adapters/abstract/schema_statements.rb +149 -78
 - data/lib/active_record/connection_adapters/abstract/transaction.rb +66 -21
 - data/lib/active_record/connection_adapters/abstract_adapter.rb +81 -96
 - data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +92 -165
 - data/lib/active_record/connection_adapters/column.rb +3 -1
 - data/lib/active_record/connection_adapters/connection_specification.rb +17 -3
 - data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +2 -0
 - data/lib/active_record/connection_adapters/mysql/column.rb +2 -0
 - data/lib/active_record/connection_adapters/mysql/database_statements.rb +47 -2
 - data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +2 -0
 - data/lib/active_record/connection_adapters/mysql/quoting.rb +9 -10
 - data/lib/active_record/connection_adapters/mysql/schema_creation.rb +5 -3
 - data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +7 -10
 - data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +30 -30
 - data/lib/active_record/connection_adapters/mysql/schema_statements.rb +106 -1
 - data/lib/active_record/connection_adapters/mysql/type_metadata.rb +2 -0
 - data/lib/active_record/connection_adapters/mysql2_adapter.rb +8 -2
 - data/lib/active_record/connection_adapters/postgresql/column.rb +2 -0
 - data/lib/active_record/connection_adapters/postgresql/database_statements.rb +6 -0
 - data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +2 -0
 - data/lib/active_record/connection_adapters/postgresql/oid/array.rb +6 -0
 - data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +2 -0
 - 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 +2 -0
 - data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
 - data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -0
 - data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
 - data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +2 -0
 - data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +2 -0
 - data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
 - data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -1
 - data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -0
 - data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -1
 - data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +2 -0
 - data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -0
 - data/lib/active_record/connection_adapters/postgresql/oid/range.rb +8 -2
 - data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +2 -0
 - data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +4 -2
 - data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +3 -1
 - 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 +3 -1
 - data/lib/active_record/connection_adapters/postgresql/quoting.rb +18 -0
 - data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +19 -25
 - data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +14 -0
 - data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +24 -11
 - data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +20 -13
 - data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +248 -112
 - data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +2 -0
 - data/lib/active_record/connection_adapters/postgresql/utils.rb +2 -0
 - data/lib/active_record/connection_adapters/postgresql_adapter.rb +57 -73
 - data/lib/active_record/connection_adapters/schema_cache.rb +4 -2
 - data/lib/active_record/connection_adapters/sql_type_metadata.rb +2 -0
 - data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +2 -0
 - data/lib/active_record/connection_adapters/sqlite3/quoting.rb +20 -1
 - data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +2 -0
 - data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +6 -15
 - data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +3 -2
 - data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +75 -1
 - data/lib/active_record/connection_adapters/sqlite3_adapter.rb +79 -92
 - data/lib/active_record/connection_adapters/statement_pool.rb +2 -0
 - data/lib/active_record/connection_handling.rb +4 -2
 - data/lib/active_record/core.rb +39 -60
 - data/lib/active_record/counter_cache.rb +20 -15
 - data/lib/active_record/define_callbacks.rb +5 -3
 - data/lib/active_record/dynamic_matchers.rb +9 -9
 - data/lib/active_record/enum.rb +17 -13
 - data/lib/active_record/errors.rb +42 -3
 - data/lib/active_record/explain.rb +3 -1
 - data/lib/active_record/explain_registry.rb +2 -0
 - data/lib/active_record/explain_subscriber.rb +2 -0
 - data/lib/active_record/fixture_set/file.rb +2 -0
 - data/lib/active_record/fixtures.rb +67 -60
 - data/lib/active_record/gem_version.rb +4 -2
 - data/lib/active_record/inheritance.rb +49 -19
 - data/lib/active_record/integration.rb +58 -19
 - data/lib/active_record/internal_metadata.rb +2 -0
 - data/lib/active_record/legacy_yaml_adapter.rb +3 -1
 - data/lib/active_record/locking/optimistic.rb +30 -42
 - data/lib/active_record/locking/pessimistic.rb +9 -6
 - data/lib/active_record/log_subscriber.rb +43 -0
 - data/lib/active_record/migration/command_recorder.rb +11 -9
 - data/lib/active_record/migration/compatibility.rb +40 -2
 - data/lib/active_record/migration/join_table.rb +2 -0
 - data/lib/active_record/migration.rb +189 -139
 - data/lib/active_record/model_schema.rb +19 -24
 - data/lib/active_record/nested_attributes.rb +18 -6
 - data/lib/active_record/no_touching.rb +3 -1
 - data/lib/active_record/null_relation.rb +2 -0
 - data/lib/active_record/persistence.rb +196 -48
 - data/lib/active_record/query_cache.rb +12 -14
 - data/lib/active_record/querying.rb +3 -1
 - data/lib/active_record/railtie.rb +61 -3
 - data/lib/active_record/railties/console_sandbox.rb +2 -0
 - data/lib/active_record/railties/controller_runtime.rb +2 -0
 - data/lib/active_record/railties/databases.rake +46 -36
 - data/lib/active_record/readonly_attributes.rb +3 -2
 - data/lib/active_record/reflection.rb +110 -192
 - data/lib/active_record/relation/batches/batch_enumerator.rb +2 -0
 - data/lib/active_record/relation/batches.rb +20 -5
 - data/lib/active_record/relation/calculations.rb +31 -9
 - data/lib/active_record/relation/delegation.rb +15 -27
 - data/lib/active_record/relation/finder_methods.rb +71 -76
 - data/lib/active_record/relation/from_clause.rb +2 -8
 - data/lib/active_record/relation/merger.rb +47 -20
 - data/lib/active_record/relation/predicate_builder/array_handler.rb +10 -7
 - data/lib/active_record/relation/predicate_builder/association_query_value.rb +46 -0
 - data/lib/active_record/relation/predicate_builder/base_handler.rb +2 -2
 - data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +12 -1
 - data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +56 -0
 - data/lib/active_record/relation/predicate_builder/range_handler.rb +26 -9
 - data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
 - data/lib/active_record/relation/predicate_builder.rb +55 -79
 - data/lib/active_record/relation/query_attribute.rb +26 -2
 - data/lib/active_record/relation/query_methods.rb +95 -91
 - data/lib/active_record/relation/record_fetch_warning.rb +2 -0
 - data/lib/active_record/relation/spawn_methods.rb +3 -1
 - data/lib/active_record/relation/where_clause.rb +65 -68
 - data/lib/active_record/relation/where_clause_factory.rb +5 -48
 - data/lib/active_record/relation.rb +106 -219
 - data/lib/active_record/result.rb +2 -0
 - data/lib/active_record/runtime_registry.rb +2 -0
 - data/lib/active_record/sanitization.rb +129 -121
 - data/lib/active_record/schema.rb +4 -2
 - data/lib/active_record/schema_dumper.rb +36 -26
 - data/lib/active_record/schema_migration.rb +2 -0
 - data/lib/active_record/scoping/default.rb +6 -7
 - data/lib/active_record/scoping/named.rb +21 -7
 - data/lib/active_record/scoping.rb +9 -8
 - data/lib/active_record/secure_token.rb +2 -0
 - data/lib/active_record/serialization.rb +2 -0
 - data/lib/active_record/statement_cache.rb +22 -12
 - data/lib/active_record/store.rb +3 -1
 - data/lib/active_record/suppressor.rb +2 -0
 - data/lib/active_record/table_metadata.rb +12 -3
 - data/lib/active_record/tasks/database_tasks.rb +25 -14
 - data/lib/active_record/tasks/mysql_database_tasks.rb +9 -48
 - data/lib/active_record/tasks/postgresql_database_tasks.rb +10 -2
 - data/lib/active_record/tasks/sqlite_database_tasks.rb +25 -3
 - data/lib/active_record/timestamp.rb +13 -6
 - data/lib/active_record/touch_later.rb +2 -0
 - data/lib/active_record/transactions.rb +32 -27
 - data/lib/active_record/translation.rb +2 -0
 - data/lib/active_record/type/adapter_specific_registry.rb +2 -0
 - 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 +2 -0
 - data/lib/active_record/type/hash_lookup_type_map.rb +2 -0
 - 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 +6 -0
 - data/lib/active_record/type/text.rb +2 -0
 - data/lib/active_record/type/time.rb +2 -0
 - data/lib/active_record/type/type_map.rb +2 -0
 - data/lib/active_record/type/unsigned_integer.rb +2 -0
 - data/lib/active_record/type.rb +4 -1
 - data/lib/active_record/type_caster/connection.rb +2 -0
 - data/lib/active_record/type_caster/map.rb +3 -1
 - data/lib/active_record/type_caster.rb +2 -0
 - data/lib/active_record/validations/absence.rb +2 -0
 - data/lib/active_record/validations/associated.rb +2 -0
 - data/lib/active_record/validations/length.rb +2 -0
 - data/lib/active_record/validations/presence.rb +2 -0
 - data/lib/active_record/validations/uniqueness.rb +36 -6
 - data/lib/active_record/validations.rb +2 -0
 - data/lib/active_record/version.rb +2 -0
 - data/lib/active_record.rb +11 -4
 - data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
 - 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/migration/migration_generator.rb +3 -1
 - data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +0 -0
 - data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +0 -0
 - data/lib/rails/generators/active_record/migration.rb +2 -0
 - data/lib/rails/generators/active_record/model/model_generator.rb +2 -23
 - data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +0 -0
 - data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
 - data/lib/rails/generators/active_record.rb +3 -1
 - metadata +23 -36
 - data/lib/active_record/associations/preloader/belongs_to.rb +0 -15
 - data/lib/active_record/associations/preloader/collection_association.rb +0 -17
 - data/lib/active_record/associations/preloader/has_many.rb +0 -15
 - 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 -18
 - data/lib/active_record/attribute/user_provided_default.rb +0 -30
 - data/lib/active_record/attribute.rb +0 -240
 - data/lib/active_record/attribute_mutation_tracker.rb +0 -114
 - data/lib/active_record/attribute_set/builder.rb +0 -124
 - data/lib/active_record/attribute_set/yaml_encoder.rb +0 -41
 - data/lib/active_record/attribute_set.rb +0 -113
 - data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -10
 - 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/polymorphic_array_handler.rb +0 -59
 - data/lib/active_record/type/internal/abstract_json.rb +0 -37
 
| 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            require "set"
         
     | 
| 
       2 
4 
     | 
    
         
             
            require "zlib"
         
     | 
| 
       3 
5 
     | 
    
         
             
            require "active_support/core_ext/module/attribute_accessors"
         
     | 
| 
         @@ -138,6 +140,7 @@ module ActiveRecord 
     | 
|
| 
       138 
140 
     | 
    
         | 
| 
       139 
141 
     | 
    
         
             
              class ConcurrentMigrationError < MigrationError #:nodoc:
         
     | 
| 
       140 
142 
     | 
    
         
             
                DEFAULT_MESSAGE = "Cannot run migrations because another migration process is currently running.".freeze
         
     | 
| 
      
 143 
     | 
    
         
            +
                RELEASE_LOCK_FAILED_MESSAGE = "Failed to release advisory lock".freeze
         
     | 
| 
       141 
144 
     | 
    
         | 
| 
       142 
145 
     | 
    
         
             
                def initialize(message = DEFAULT_MESSAGE)
         
     | 
| 
       143 
146 
     | 
    
         
             
                  super
         
     | 
| 
         @@ -157,7 +160,7 @@ module ActiveRecord 
     | 
|
| 
       157 
160 
     | 
    
         | 
| 
       158 
161 
     | 
    
         
             
              class ProtectedEnvironmentError < ActiveRecordError #:nodoc:
         
     | 
| 
       159 
162 
     | 
    
         
             
                def initialize(env = "production")
         
     | 
| 
       160 
     | 
    
         
            -
                  msg = "You are attempting to run a destructive action against your '#{env}' database.\n"
         
     | 
| 
      
 163 
     | 
    
         
            +
                  msg = "You are attempting to run a destructive action against your '#{env}' database.\n".dup
         
     | 
| 
       161 
164 
     | 
    
         
             
                  msg << "If you are sure you want to continue, run the same command with the environment variable:\n"
         
     | 
| 
       162 
165 
     | 
    
         
             
                  msg << "DISABLE_DATABASE_ENVIRONMENT_CHECK=1"
         
     | 
| 
       163 
166 
     | 
    
         
             
                  super(msg)
         
     | 
| 
         @@ -166,7 +169,7 @@ module ActiveRecord 
     | 
|
| 
       166 
169 
     | 
    
         | 
| 
       167 
170 
     | 
    
         
             
              class EnvironmentMismatchError < ActiveRecordError
         
     | 
| 
       168 
171 
     | 
    
         
             
                def initialize(current: nil, stored: nil)
         
     | 
| 
       169 
     | 
    
         
            -
                  msg =  "You are attempting to modify a database that was last run in `#{ stored }` environment.\n"
         
     | 
| 
      
 172 
     | 
    
         
            +
                  msg =  "You are attempting to modify a database that was last run in `#{ stored }` environment.\n".dup
         
     | 
| 
       170 
173 
     | 
    
         
             
                  msg << "You are running in `#{ current }` environment. "
         
     | 
| 
       171 
174 
     | 
    
         
             
                  msg << "If you are sure you want to continue, first set the environment using:\n\n"
         
     | 
| 
       172 
175 
     | 
    
         
             
                  msg << "        bin/rails db:environment:set"
         
     | 
| 
         @@ -352,9 +355,9 @@ module ActiveRecord 
     | 
|
| 
       352 
355 
     | 
    
         
             
              # to match the structure of your database.
         
     | 
| 
       353 
356 
     | 
    
         
             
              #
         
     | 
| 
       354 
357 
     | 
    
         
             
              # To roll the database back to a previous migration version, use
         
     | 
| 
       355 
     | 
    
         
            -
              # <tt>rails db: 
     | 
| 
      
 358 
     | 
    
         
            +
              # <tt>rails db:rollback VERSION=X</tt> where <tt>X</tt> is the version to which
         
     | 
| 
       356 
359 
     | 
    
         
             
              # you wish to downgrade. Alternatively, you can also use the STEP option if you
         
     | 
| 
       357 
     | 
    
         
            -
              # wish to rollback last few migrations. <tt>rails db: 
     | 
| 
      
 360 
     | 
    
         
            +
              # wish to rollback last few migrations. <tt>rails db:rollback STEP=2</tt> will rollback
         
     | 
| 
       358 
361 
     | 
    
         
             
              # the latest two migrations.
         
     | 
| 
       359 
362 
     | 
    
         
             
              #
         
     | 
| 
       360 
363 
     | 
    
         
             
              # If any of the migrations throw an <tt>ActiveRecord::IrreversibleMigration</tt> exception,
         
     | 
| 
         @@ -548,7 +551,7 @@ module ActiveRecord 
     | 
|
| 
       548 
551 
     | 
    
         
             
                  end
         
     | 
| 
       549 
552 
     | 
    
         | 
| 
       550 
553 
     | 
    
         
             
                  def call(env)
         
     | 
| 
       551 
     | 
    
         
            -
                    mtime = ActiveRecord:: 
     | 
| 
      
 554 
     | 
    
         
            +
                    mtime = ActiveRecord::Base.connection.migration_context.last_migration.mtime.to_i
         
     | 
| 
       552 
555 
     | 
    
         
             
                    if @last_check < mtime
         
     | 
| 
       553 
556 
     | 
    
         
             
                      ActiveRecord::Migration.check_pending!(connection)
         
     | 
| 
       554 
557 
     | 
    
         
             
                      @last_check = mtime
         
     | 
| 
         @@ -573,13 +576,14 @@ module ActiveRecord 
     | 
|
| 
       573 
576 
     | 
    
         | 
| 
       574 
577 
     | 
    
         
             
                  # Raises <tt>ActiveRecord::PendingMigrationError</tt> error if any migrations are pending.
         
     | 
| 
       575 
578 
     | 
    
         
             
                  def check_pending!(connection = Base.connection)
         
     | 
| 
       576 
     | 
    
         
            -
                    raise ActiveRecord::PendingMigrationError if  
     | 
| 
      
 579 
     | 
    
         
            +
                    raise ActiveRecord::PendingMigrationError if connection.migration_context.needs_migration?
         
     | 
| 
       577 
580 
     | 
    
         
             
                  end
         
     | 
| 
       578 
581 
     | 
    
         | 
| 
       579 
582 
     | 
    
         
             
                  def load_schema_if_pending!
         
     | 
| 
       580 
     | 
    
         
            -
                    if  
     | 
| 
      
 583 
     | 
    
         
            +
                    if Base.connection.migration_context.needs_migration? || !Base.connection.migration_context.any_migrations?
         
     | 
| 
       581 
584 
     | 
    
         
             
                      # Roundtrip to Rake to allow plugins to hook into database initialization.
         
     | 
| 
       582 
     | 
    
         
            -
                       
     | 
| 
      
 585 
     | 
    
         
            +
                      root = defined?(ENGINE_ROOT) ? ENGINE_ROOT : Rails.root
         
     | 
| 
      
 586 
     | 
    
         
            +
                      FileUtils.cd(root) do
         
     | 
| 
       583 
587 
     | 
    
         
             
                        current_config = Base.connection_config
         
     | 
| 
       584 
588 
     | 
    
         
             
                        Base.clear_all_connections!
         
     | 
| 
       585 
589 
     | 
    
         
             
                        system("bin/rails db:test:prepare")
         
     | 
| 
         @@ -731,6 +735,24 @@ module ActiveRecord 
     | 
|
| 
       731 
735 
     | 
    
         
             
                  execute_block { yield helper }
         
     | 
| 
       732 
736 
     | 
    
         
             
                end
         
     | 
| 
       733 
737 
     | 
    
         | 
| 
      
 738 
     | 
    
         
            +
                # Used to specify an operation that is only run when migrating up
         
     | 
| 
      
 739 
     | 
    
         
            +
                # (for example, populating a new column with its initial values).
         
     | 
| 
      
 740 
     | 
    
         
            +
                #
         
     | 
| 
      
 741 
     | 
    
         
            +
                # In the following example, the new column +published+ will be given
         
     | 
| 
      
 742 
     | 
    
         
            +
                # the value +true+ for all existing records.
         
     | 
| 
      
 743 
     | 
    
         
            +
                #
         
     | 
| 
      
 744 
     | 
    
         
            +
                #    class AddPublishedToPosts < ActiveRecord::Migration[5.2]
         
     | 
| 
      
 745 
     | 
    
         
            +
                #      def change
         
     | 
| 
      
 746 
     | 
    
         
            +
                #        add_column :posts, :published, :boolean, default: false
         
     | 
| 
      
 747 
     | 
    
         
            +
                #        up_only do
         
     | 
| 
      
 748 
     | 
    
         
            +
                #          execute "update posts set published = 'true'"
         
     | 
| 
      
 749 
     | 
    
         
            +
                #        end
         
     | 
| 
      
 750 
     | 
    
         
            +
                #      end
         
     | 
| 
      
 751 
     | 
    
         
            +
                #    end
         
     | 
| 
      
 752 
     | 
    
         
            +
                def up_only
         
     | 
| 
      
 753 
     | 
    
         
            +
                  execute_block { yield } unless reverting?
         
     | 
| 
      
 754 
     | 
    
         
            +
                end
         
     | 
| 
      
 755 
     | 
    
         
            +
             
     | 
| 
       734 
756 
     | 
    
         
             
                # Runs the given migration classes.
         
     | 
| 
       735 
757 
     | 
    
         
             
                # Last argument can specify options:
         
     | 
| 
       736 
758 
     | 
    
         
             
                # - :direction (default is :up)
         
     | 
| 
         @@ -855,23 +877,25 @@ module ActiveRecord 
     | 
|
| 
       855 
877 
     | 
    
         | 
| 
       856 
878 
     | 
    
         
             
                  FileUtils.mkdir_p(destination) unless File.exist?(destination)
         
     | 
| 
       857 
879 
     | 
    
         | 
| 
       858 
     | 
    
         
            -
                  destination_migrations = ActiveRecord:: 
     | 
| 
      
 880 
     | 
    
         
            +
                  destination_migrations = ActiveRecord::MigrationContext.new(destination).migrations
         
     | 
| 
       859 
881 
     | 
    
         
             
                  last = destination_migrations.last
         
     | 
| 
       860 
882 
     | 
    
         
             
                  sources.each do |scope, path|
         
     | 
| 
       861 
     | 
    
         
            -
                    source_migrations = ActiveRecord:: 
     | 
| 
      
 883 
     | 
    
         
            +
                    source_migrations = ActiveRecord::MigrationContext.new(path).migrations
         
     | 
| 
       862 
884 
     | 
    
         | 
| 
       863 
885 
     | 
    
         
             
                    source_migrations.each do |migration|
         
     | 
| 
       864 
886 
     | 
    
         
             
                      source = File.binread(migration.filename)
         
     | 
| 
       865 
887 
     | 
    
         
             
                      inserted_comment = "# This migration comes from #{scope} (originally #{migration.version})\n"
         
     | 
| 
       866 
     | 
    
         
            -
                       
     | 
| 
      
 888 
     | 
    
         
            +
                      magic_comments = "".dup
         
     | 
| 
      
 889 
     | 
    
         
            +
                      loop do
         
     | 
| 
       867 
890 
     | 
    
         
             
                        # If we have a magic comment in the original migration,
         
     | 
| 
       868 
891 
     | 
    
         
             
                        # insert our comment after the first newline(end of the magic comment line)
         
     | 
| 
       869 
892 
     | 
    
         
             
                        # so the magic keep working.
         
     | 
| 
       870 
893 
     | 
    
         
             
                        # Note that magic comments must be at the first line(except sh-bang).
         
     | 
| 
       871 
     | 
    
         
            -
                        source 
     | 
| 
       872 
     | 
    
         
            -
             
     | 
| 
       873 
     | 
    
         
            -
                         
     | 
| 
      
 894 
     | 
    
         
            +
                        source.sub!(/\A(?:#.*\b(?:en)?coding:\s*\S+|#\s*frozen_string_literal:\s*(?:true|false)).*\n/) do |magic_comment|
         
     | 
| 
      
 895 
     | 
    
         
            +
                          magic_comments << magic_comment; ""
         
     | 
| 
      
 896 
     | 
    
         
            +
                        end || break
         
     | 
| 
       874 
897 
     | 
    
         
             
                      end
         
     | 
| 
      
 898 
     | 
    
         
            +
                      source = "#{magic_comments}#{inserted_comment}#{source}"
         
     | 
| 
       875 
899 
     | 
    
         | 
| 
       876 
900 
     | 
    
         
             
                      if duplicate = destination_migrations.detect { |m| m.name == migration.name }
         
     | 
| 
       877 
901 
     | 
    
         
             
                        if options[:on_skip] && duplicate.scope != scope.to_s
         
     | 
| 
         @@ -974,146 +998,184 @@ module ActiveRecord 
     | 
|
| 
       974 
998 
     | 
    
         
             
                end
         
     | 
| 
       975 
999 
     | 
    
         
             
              end
         
     | 
| 
       976 
1000 
     | 
    
         | 
| 
       977 
     | 
    
         
            -
              class  
     | 
| 
       978 
     | 
    
         
            -
                 
     | 
| 
       979 
     | 
    
         
            -
                  attr_writer :migrations_paths
         
     | 
| 
       980 
     | 
    
         
            -
                  alias :migrations_path= :migrations_paths=
         
     | 
| 
       981 
     | 
    
         
            -
             
     | 
| 
       982 
     | 
    
         
            -
                  def migrate(migrations_paths, target_version = nil, &block)
         
     | 
| 
       983 
     | 
    
         
            -
                    case
         
     | 
| 
       984 
     | 
    
         
            -
                    when target_version.nil?
         
     | 
| 
       985 
     | 
    
         
            -
                      up(migrations_paths, target_version, &block)
         
     | 
| 
       986 
     | 
    
         
            -
                    when current_version == 0 && target_version == 0
         
     | 
| 
       987 
     | 
    
         
            -
                      []
         
     | 
| 
       988 
     | 
    
         
            -
                    when current_version > target_version
         
     | 
| 
       989 
     | 
    
         
            -
                      down(migrations_paths, target_version, &block)
         
     | 
| 
       990 
     | 
    
         
            -
                    else
         
     | 
| 
       991 
     | 
    
         
            -
                      up(migrations_paths, target_version, &block)
         
     | 
| 
       992 
     | 
    
         
            -
                    end
         
     | 
| 
       993 
     | 
    
         
            -
                  end
         
     | 
| 
      
 1001 
     | 
    
         
            +
              class MigrationContext # :nodoc:
         
     | 
| 
      
 1002 
     | 
    
         
            +
                attr_reader :migrations_paths
         
     | 
| 
       994 
1003 
     | 
    
         | 
| 
       995 
     | 
    
         
            -
             
     | 
| 
       996 
     | 
    
         
            -
             
     | 
| 
       997 
     | 
    
         
            -
             
     | 
| 
      
 1004 
     | 
    
         
            +
                def initialize(migrations_paths)
         
     | 
| 
      
 1005 
     | 
    
         
            +
                  @migrations_paths = migrations_paths
         
     | 
| 
      
 1006 
     | 
    
         
            +
                end
         
     | 
| 
       998 
1007 
     | 
    
         | 
| 
       999 
     | 
    
         
            -
             
     | 
| 
       1000 
     | 
    
         
            -
             
     | 
| 
      
 1008 
     | 
    
         
            +
                def migrate(target_version = nil, &block)
         
     | 
| 
      
 1009 
     | 
    
         
            +
                  case
         
     | 
| 
      
 1010 
     | 
    
         
            +
                  when target_version.nil?
         
     | 
| 
      
 1011 
     | 
    
         
            +
                    up(target_version, &block)
         
     | 
| 
      
 1012 
     | 
    
         
            +
                  when current_version == 0 && target_version == 0
         
     | 
| 
      
 1013 
     | 
    
         
            +
                    []
         
     | 
| 
      
 1014 
     | 
    
         
            +
                  when current_version > target_version
         
     | 
| 
      
 1015 
     | 
    
         
            +
                    down(target_version, &block)
         
     | 
| 
      
 1016 
     | 
    
         
            +
                  else
         
     | 
| 
      
 1017 
     | 
    
         
            +
                    up(target_version, &block)
         
     | 
| 
       1001 
1018 
     | 
    
         
             
                  end
         
     | 
| 
      
 1019 
     | 
    
         
            +
                end
         
     | 
| 
      
 1020 
     | 
    
         
            +
             
     | 
| 
      
 1021 
     | 
    
         
            +
                def rollback(steps = 1)
         
     | 
| 
      
 1022 
     | 
    
         
            +
                  move(:down, steps)
         
     | 
| 
      
 1023 
     | 
    
         
            +
                end
         
     | 
| 
       1002 
1024 
     | 
    
         | 
| 
       1003 
     | 
    
         
            -
             
     | 
| 
       1004 
     | 
    
         
            -
             
     | 
| 
       1005 
     | 
    
         
            -
             
     | 
| 
      
 1025 
     | 
    
         
            +
                def forward(steps = 1)
         
     | 
| 
      
 1026 
     | 
    
         
            +
                  move(:up, steps)
         
     | 
| 
      
 1027 
     | 
    
         
            +
                end
         
     | 
| 
       1006 
1028 
     | 
    
         | 
| 
       1007 
     | 
    
         
            -
             
     | 
| 
      
 1029 
     | 
    
         
            +
                def up(target_version = nil)
         
     | 
| 
      
 1030 
     | 
    
         
            +
                  selected_migrations = if block_given?
         
     | 
| 
      
 1031 
     | 
    
         
            +
                    migrations.select { |m| yield m }
         
     | 
| 
      
 1032 
     | 
    
         
            +
                  else
         
     | 
| 
      
 1033 
     | 
    
         
            +
                    migrations
         
     | 
| 
       1008 
1034 
     | 
    
         
             
                  end
         
     | 
| 
       1009 
1035 
     | 
    
         | 
| 
       1010 
     | 
    
         
            -
                   
     | 
| 
       1011 
     | 
    
         
            -
             
     | 
| 
       1012 
     | 
    
         
            -
                    migrations.select! { |m| yield m } if block_given?
         
     | 
| 
      
 1036 
     | 
    
         
            +
                  Migrator.new(:up, selected_migrations, target_version).migrate
         
     | 
| 
      
 1037 
     | 
    
         
            +
                end
         
     | 
| 
       1013 
1038 
     | 
    
         | 
| 
       1014 
     | 
    
         
            -
             
     | 
| 
      
 1039 
     | 
    
         
            +
                def down(target_version = nil)
         
     | 
| 
      
 1040 
     | 
    
         
            +
                  selected_migrations = if block_given?
         
     | 
| 
      
 1041 
     | 
    
         
            +
                    migrations.select { |m| yield m }
         
     | 
| 
      
 1042 
     | 
    
         
            +
                  else
         
     | 
| 
      
 1043 
     | 
    
         
            +
                    migrations
         
     | 
| 
       1015 
1044 
     | 
    
         
             
                  end
         
     | 
| 
       1016 
1045 
     | 
    
         | 
| 
       1017 
     | 
    
         
            -
                   
     | 
| 
       1018 
     | 
    
         
            -
             
     | 
| 
       1019 
     | 
    
         
            -
                  end
         
     | 
| 
      
 1046 
     | 
    
         
            +
                  Migrator.new(:down, selected_migrations, target_version).migrate
         
     | 
| 
      
 1047 
     | 
    
         
            +
                end
         
     | 
| 
       1020 
1048 
     | 
    
         | 
| 
       1021 
     | 
    
         
            -
             
     | 
| 
       1022 
     | 
    
         
            -
             
     | 
| 
       1023 
     | 
    
         
            -
             
     | 
| 
      
 1049 
     | 
    
         
            +
                def run(direction, target_version)
         
     | 
| 
      
 1050 
     | 
    
         
            +
                  Migrator.new(direction, migrations, target_version).run
         
     | 
| 
      
 1051 
     | 
    
         
            +
                end
         
     | 
| 
       1024 
1052 
     | 
    
         | 
| 
       1025 
     | 
    
         
            -
             
     | 
| 
       1026 
     | 
    
         
            -
             
     | 
| 
       1027 
     | 
    
         
            -
             
     | 
| 
       1028 
     | 
    
         
            -
                  deprecate :schema_migrations_table_name
         
     | 
| 
      
 1053 
     | 
    
         
            +
                def open
         
     | 
| 
      
 1054 
     | 
    
         
            +
                  Migrator.new(:up, migrations, nil)
         
     | 
| 
      
 1055 
     | 
    
         
            +
                end
         
     | 
| 
       1029 
1056 
     | 
    
         | 
| 
       1030 
     | 
    
         
            -
             
     | 
| 
       1031 
     | 
    
         
            -
             
     | 
| 
       1032 
     | 
    
         
            -
             
     | 
| 
       1033 
     | 
    
         
            -
             
     | 
| 
       1034 
     | 
    
         
            -
             
     | 
| 
       1035 
     | 
    
         
            -
                    end
         
     | 
| 
      
 1057 
     | 
    
         
            +
                def get_all_versions
         
     | 
| 
      
 1058 
     | 
    
         
            +
                  if SchemaMigration.table_exists?
         
     | 
| 
      
 1059 
     | 
    
         
            +
                    SchemaMigration.all_versions.map(&:to_i)
         
     | 
| 
      
 1060 
     | 
    
         
            +
                  else
         
     | 
| 
      
 1061 
     | 
    
         
            +
                    []
         
     | 
| 
       1036 
1062 
     | 
    
         
             
                  end
         
     | 
| 
      
 1063 
     | 
    
         
            +
                end
         
     | 
| 
       1037 
1064 
     | 
    
         | 
| 
       1038 
     | 
    
         
            -
             
     | 
| 
       1039 
     | 
    
         
            -
             
     | 
| 
       1040 
     | 
    
         
            -
             
     | 
| 
      
 1065 
     | 
    
         
            +
                def current_version
         
     | 
| 
      
 1066 
     | 
    
         
            +
                  get_all_versions.max || 0
         
     | 
| 
      
 1067 
     | 
    
         
            +
                rescue ActiveRecord::NoDatabaseError
         
     | 
| 
      
 1068 
     | 
    
         
            +
                end
         
     | 
| 
       1041 
1069 
     | 
    
         | 
| 
       1042 
     | 
    
         
            -
             
     | 
| 
       1043 
     | 
    
         
            -
             
     | 
| 
       1044 
     | 
    
         
            -
             
     | 
| 
      
 1070 
     | 
    
         
            +
                def needs_migration?
         
     | 
| 
      
 1071 
     | 
    
         
            +
                  (migrations.collect(&:version) - get_all_versions).size > 0
         
     | 
| 
      
 1072 
     | 
    
         
            +
                end
         
     | 
| 
       1045 
1073 
     | 
    
         | 
| 
       1046 
     | 
    
         
            -
             
     | 
| 
       1047 
     | 
    
         
            -
             
     | 
| 
       1048 
     | 
    
         
            -
             
     | 
| 
      
 1074 
     | 
    
         
            +
                def any_migrations?
         
     | 
| 
      
 1075 
     | 
    
         
            +
                  migrations.any?
         
     | 
| 
      
 1076 
     | 
    
         
            +
                end
         
     | 
| 
       1049 
1077 
     | 
    
         | 
| 
       1050 
     | 
    
         
            -
             
     | 
| 
       1051 
     | 
    
         
            -
             
     | 
| 
       1052 
     | 
    
         
            -
             
     | 
| 
      
 1078 
     | 
    
         
            +
                def last_migration #:nodoc:
         
     | 
| 
      
 1079 
     | 
    
         
            +
                  migrations.last || NullMigration.new
         
     | 
| 
      
 1080 
     | 
    
         
            +
                end
         
     | 
| 
       1053 
1081 
     | 
    
         | 
| 
       1054 
     | 
    
         
            -
             
     | 
| 
       1055 
     | 
    
         
            -
             
     | 
| 
       1056 
     | 
    
         
            -
             
     | 
| 
       1057 
     | 
    
         
            -
                    Array(@migrations_paths)
         
     | 
| 
       1058 
     | 
    
         
            -
                  end
         
     | 
| 
      
 1082 
     | 
    
         
            +
                def parse_migration_filename(filename) # :nodoc:
         
     | 
| 
      
 1083 
     | 
    
         
            +
                  File.basename(filename).scan(Migration::MigrationFilenameRegexp).first
         
     | 
| 
      
 1084 
     | 
    
         
            +
                end
         
     | 
| 
       1059 
1085 
     | 
    
         | 
| 
       1060 
     | 
    
         
            -
             
     | 
| 
       1061 
     | 
    
         
            -
             
     | 
| 
      
 1086 
     | 
    
         
            +
                def migrations
         
     | 
| 
      
 1087 
     | 
    
         
            +
                  migrations = migration_files.map do |file|
         
     | 
| 
      
 1088 
     | 
    
         
            +
                    version, name, scope = parse_migration_filename(file)
         
     | 
| 
      
 1089 
     | 
    
         
            +
                    raise IllegalMigrationNameError.new(file) unless version
         
     | 
| 
      
 1090 
     | 
    
         
            +
                    version = version.to_i
         
     | 
| 
      
 1091 
     | 
    
         
            +
                    name = name.camelize
         
     | 
| 
      
 1092 
     | 
    
         
            +
             
     | 
| 
      
 1093 
     | 
    
         
            +
                    MigrationProxy.new(name, version, file, scope)
         
     | 
| 
       1062 
1094 
     | 
    
         
             
                  end
         
     | 
| 
       1063 
1095 
     | 
    
         | 
| 
       1064 
     | 
    
         
            -
                   
     | 
| 
       1065 
     | 
    
         
            -
             
     | 
| 
      
 1096 
     | 
    
         
            +
                  migrations.sort_by(&:version)
         
     | 
| 
      
 1097 
     | 
    
         
            +
                end
         
     | 
| 
       1066 
1098 
     | 
    
         | 
| 
       1067 
     | 
    
         
            -
             
     | 
| 
       1068 
     | 
    
         
            -
             
     | 
| 
       1069 
     | 
    
         
            -
                      raise IllegalMigrationNameError.new(file) unless version
         
     | 
| 
       1070 
     | 
    
         
            -
                      version = version.to_i
         
     | 
| 
       1071 
     | 
    
         
            -
                      name = name.camelize
         
     | 
| 
      
 1099 
     | 
    
         
            +
                def migrations_status
         
     | 
| 
      
 1100 
     | 
    
         
            +
                  db_list = ActiveRecord::SchemaMigration.normalized_versions
         
     | 
| 
       1072 
1101 
     | 
    
         | 
| 
       1073 
     | 
    
         
            -
             
     | 
| 
       1074 
     | 
    
         
            -
                     
     | 
| 
      
 1102 
     | 
    
         
            +
                  file_list = migration_files.map do |file|
         
     | 
| 
      
 1103 
     | 
    
         
            +
                    version, name, scope = parse_migration_filename(file)
         
     | 
| 
      
 1104 
     | 
    
         
            +
                    raise IllegalMigrationNameError.new(file) unless version
         
     | 
| 
      
 1105 
     | 
    
         
            +
                    version = ActiveRecord::SchemaMigration.normalize_migration_number(version)
         
     | 
| 
      
 1106 
     | 
    
         
            +
                    status = db_list.delete(version) ? "up" : "down"
         
     | 
| 
      
 1107 
     | 
    
         
            +
                    [status, version, (name + scope).humanize]
         
     | 
| 
      
 1108 
     | 
    
         
            +
                  end.compact
         
     | 
| 
       1075 
1109 
     | 
    
         | 
| 
       1076 
     | 
    
         
            -
             
     | 
| 
      
 1110 
     | 
    
         
            +
                  db_list.map! do |version|
         
     | 
| 
      
 1111 
     | 
    
         
            +
                    ["up", version, "********** NO FILE **********"]
         
     | 
| 
       1077 
1112 
     | 
    
         
             
                  end
         
     | 
| 
       1078 
1113 
     | 
    
         | 
| 
       1079 
     | 
    
         
            -
                   
     | 
| 
       1080 
     | 
    
         
            -
             
     | 
| 
      
 1114 
     | 
    
         
            +
                  (db_list + file_list).sort_by { |_, version, _| version }
         
     | 
| 
      
 1115 
     | 
    
         
            +
                end
         
     | 
| 
      
 1116 
     | 
    
         
            +
             
     | 
| 
      
 1117 
     | 
    
         
            +
                def migration_files
         
     | 
| 
      
 1118 
     | 
    
         
            +
                  paths = Array(migrations_paths)
         
     | 
| 
      
 1119 
     | 
    
         
            +
                  Dir[*paths.flat_map { |path| "#{path}/**/[0-9]*_*.rb" }]
         
     | 
| 
      
 1120 
     | 
    
         
            +
                end
         
     | 
| 
      
 1121 
     | 
    
         
            +
             
     | 
| 
      
 1122 
     | 
    
         
            +
                def current_environment
         
     | 
| 
      
 1123 
     | 
    
         
            +
                  ActiveRecord::ConnectionHandling::DEFAULT_ENV.call
         
     | 
| 
      
 1124 
     | 
    
         
            +
                end
         
     | 
| 
      
 1125 
     | 
    
         
            +
             
     | 
| 
      
 1126 
     | 
    
         
            +
                def protected_environment?
         
     | 
| 
      
 1127 
     | 
    
         
            +
                  ActiveRecord::Base.protected_environments.include?(last_stored_environment) if last_stored_environment
         
     | 
| 
      
 1128 
     | 
    
         
            +
                end
         
     | 
| 
      
 1129 
     | 
    
         
            +
             
     | 
| 
      
 1130 
     | 
    
         
            +
                def last_stored_environment
         
     | 
| 
      
 1131 
     | 
    
         
            +
                  return nil if current_version == 0
         
     | 
| 
      
 1132 
     | 
    
         
            +
                  raise NoEnvironmentInSchemaError unless ActiveRecord::InternalMetadata.table_exists?
         
     | 
| 
       1081 
1133 
     | 
    
         | 
| 
       1082 
     | 
    
         
            -
             
     | 
| 
      
 1134 
     | 
    
         
            +
                  environment = ActiveRecord::InternalMetadata[:environment]
         
     | 
| 
      
 1135 
     | 
    
         
            +
                  raise NoEnvironmentInSchemaError unless environment
         
     | 
| 
      
 1136 
     | 
    
         
            +
                  environment
         
     | 
| 
      
 1137 
     | 
    
         
            +
                end
         
     | 
| 
       1083 
1138 
     | 
    
         | 
| 
       1084 
     | 
    
         
            -
             
     | 
| 
       1085 
     | 
    
         
            -
             
     | 
| 
       1086 
     | 
    
         
            -
             
     | 
| 
       1087 
     | 
    
         
            -
                      version = ActiveRecord::SchemaMigration.normalize_migration_number(version)
         
     | 
| 
       1088 
     | 
    
         
            -
                      status = db_list.delete(version) ? "up" : "down"
         
     | 
| 
       1089 
     | 
    
         
            -
                      [status, version, (name + scope).humanize]
         
     | 
| 
       1090 
     | 
    
         
            -
                    end.compact
         
     | 
| 
      
 1139 
     | 
    
         
            +
                private
         
     | 
| 
      
 1140 
     | 
    
         
            +
                  def move(direction, steps)
         
     | 
| 
      
 1141 
     | 
    
         
            +
                    migrator = Migrator.new(direction, migrations)
         
     | 
| 
       1091 
1142 
     | 
    
         | 
| 
       1092 
     | 
    
         
            -
                     
     | 
| 
       1093 
     | 
    
         
            -
                       
     | 
| 
      
 1143 
     | 
    
         
            +
                    if current_version != 0 && !migrator.current_migration
         
     | 
| 
      
 1144 
     | 
    
         
            +
                      raise UnknownMigrationVersionError.new(current_version)
         
     | 
| 
       1094 
1145 
     | 
    
         
             
                    end
         
     | 
| 
       1095 
1146 
     | 
    
         | 
| 
       1096 
     | 
    
         
            -
                     
     | 
| 
       1097 
     | 
    
         
            -
             
     | 
| 
      
 1147 
     | 
    
         
            +
                    start_index =
         
     | 
| 
      
 1148 
     | 
    
         
            +
                      if current_version == 0
         
     | 
| 
      
 1149 
     | 
    
         
            +
                        0
         
     | 
| 
      
 1150 
     | 
    
         
            +
                      else
         
     | 
| 
      
 1151 
     | 
    
         
            +
                        migrator.migrations.index(migrator.current_migration)
         
     | 
| 
      
 1152 
     | 
    
         
            +
                      end
         
     | 
| 
       1098 
1153 
     | 
    
         | 
| 
       1099 
     | 
    
         
            -
             
     | 
| 
       1100 
     | 
    
         
            -
                     
     | 
| 
      
 1154 
     | 
    
         
            +
                    finish = migrator.migrations[start_index + steps]
         
     | 
| 
      
 1155 
     | 
    
         
            +
                    version = finish ? finish.version : 0
         
     | 
| 
      
 1156 
     | 
    
         
            +
                    send(direction, version)
         
     | 
| 
       1101 
1157 
     | 
    
         
             
                  end
         
     | 
| 
      
 1158 
     | 
    
         
            +
              end
         
     | 
| 
       1102 
1159 
     | 
    
         | 
| 
       1103 
     | 
    
         
            -
             
     | 
| 
      
 1160 
     | 
    
         
            +
              class Migrator # :nodoc:
         
     | 
| 
      
 1161 
     | 
    
         
            +
                class << self
         
     | 
| 
      
 1162 
     | 
    
         
            +
                  attr_accessor :migrations_paths
         
     | 
| 
       1104 
1163 
     | 
    
         | 
| 
       1105 
     | 
    
         
            -
                  def  
     | 
| 
       1106 
     | 
    
         
            -
                     
     | 
| 
       1107 
     | 
    
         
            -
             
     | 
| 
      
 1164 
     | 
    
         
            +
                  def migrations_path=(path)
         
     | 
| 
      
 1165 
     | 
    
         
            +
                    ActiveSupport::Deprecation.warn \
         
     | 
| 
      
 1166 
     | 
    
         
            +
                      "ActiveRecord::Migrator.migrations_paths= is now deprecated and will be removed in Rails 6.0." \
         
     | 
| 
      
 1167 
     | 
    
         
            +
                      "You can set the `migrations_paths` on the `connection` instead through the `database.yml`."
         
     | 
| 
      
 1168 
     | 
    
         
            +
                    self.migrations_paths = [path]
         
     | 
| 
      
 1169 
     | 
    
         
            +
                  end
         
     | 
| 
       1108 
1170 
     | 
    
         | 
| 
       1109 
     | 
    
         
            -
             
     | 
| 
       1110 
     | 
    
         
            -
             
     | 
| 
       1111 
     | 
    
         
            -
             
     | 
| 
       1112 
     | 
    
         
            -
                      send(direction, migrations_paths, version)
         
     | 
| 
       1113 
     | 
    
         
            -
                    end
         
     | 
| 
      
 1171 
     | 
    
         
            +
                  # For cases where a table doesn't exist like loading from schema cache
         
     | 
| 
      
 1172 
     | 
    
         
            +
                  def current_version
         
     | 
| 
      
 1173 
     | 
    
         
            +
                    MigrationContext.new(migrations_paths).current_version
         
     | 
| 
       1114 
1174 
     | 
    
         
             
                  end
         
     | 
| 
       1115 
1175 
     | 
    
         
             
                end
         
     | 
| 
       1116 
1176 
     | 
    
         | 
| 
      
 1177 
     | 
    
         
            +
                self.migrations_paths = ["db/migrate"]
         
     | 
| 
      
 1178 
     | 
    
         
            +
             
     | 
| 
       1117 
1179 
     | 
    
         
             
                def initialize(direction, migrations, target_version = nil)
         
     | 
| 
       1118 
1180 
     | 
    
         
             
                  @direction         = direction
         
     | 
| 
       1119 
1181 
     | 
    
         
             
                  @target_version    = target_version
         
     | 
| 
         @@ -1176,7 +1238,7 @@ module ActiveRecord 
     | 
|
| 
       1176 
1238 
     | 
    
         
             
                end
         
     | 
| 
       1177 
1239 
     | 
    
         | 
| 
       1178 
1240 
     | 
    
         
             
                def load_migrated
         
     | 
| 
       1179 
     | 
    
         
            -
                  @migrated_versions = Set.new( 
     | 
| 
      
 1241 
     | 
    
         
            +
                  @migrated_versions = Set.new(Base.connection.migration_context.get_all_versions)
         
     | 
| 
       1180 
1242 
     | 
    
         
             
                end
         
     | 
| 
       1181 
1243 
     | 
    
         | 
| 
       1182 
1244 
     | 
    
         
             
                private
         
     | 
| 
         @@ -1208,7 +1270,7 @@ module ActiveRecord 
     | 
|
| 
       1208 
1270 
     | 
    
         
             
                  # Stores the current environment in the database.
         
     | 
| 
       1209 
1271 
     | 
    
         
             
                  def record_environment
         
     | 
| 
       1210 
1272 
     | 
    
         
             
                    return if down?
         
     | 
| 
       1211 
     | 
    
         
            -
                    ActiveRecord::InternalMetadata[:environment] = ActiveRecord:: 
     | 
| 
      
 1273 
     | 
    
         
            +
                    ActiveRecord::InternalMetadata[:environment] = ActiveRecord::Base.connection.migration_context.current_environment
         
     | 
| 
       1212 
1274 
     | 
    
         
             
                  end
         
     | 
| 
       1213 
1275 
     | 
    
         | 
| 
       1214 
1276 
     | 
    
         
             
                  def ran?(migration)
         
     | 
| 
         @@ -1217,7 +1279,7 @@ module ActiveRecord 
     | 
|
| 
       1217 
1279 
     | 
    
         | 
| 
       1218 
1280 
     | 
    
         
             
                  # Return true if a valid version is not provided.
         
     | 
| 
       1219 
1281 
     | 
    
         
             
                  def invalid_target?
         
     | 
| 
       1220 
     | 
    
         
            -
                     
     | 
| 
      
 1282 
     | 
    
         
            +
                    @target_version && @target_version != 0 && !target
         
     | 
| 
       1221 
1283 
     | 
    
         
             
                  end
         
     | 
| 
       1222 
1284 
     | 
    
         | 
| 
       1223 
1285 
     | 
    
         
             
                  def execute_migration_in_transaction(migration, direction)
         
     | 
| 
         @@ -1231,7 +1293,7 @@ module ActiveRecord 
     | 
|
| 
       1231 
1293 
     | 
    
         
             
                      record_version_state_after_migrating(migration.version)
         
     | 
| 
       1232 
1294 
     | 
    
         
             
                    end
         
     | 
| 
       1233 
1295 
     | 
    
         
             
                  rescue => e
         
     | 
| 
       1234 
     | 
    
         
            -
                    msg = "An error has occurred, "
         
     | 
| 
      
 1296 
     | 
    
         
            +
                    msg = "An error has occurred, ".dup
         
     | 
| 
       1235 
1297 
     | 
    
         
             
                    msg << "this and " if use_transaction?(migration)
         
     | 
| 
       1236 
1298 
     | 
    
         
             
                    msg << "all later migrations canceled:\n\n#{e}"
         
     | 
| 
       1237 
1299 
     | 
    
         
             
                    raise StandardError, msg, e.backtrace
         
     | 
| 
         @@ -1250,10 +1312,10 @@ module ActiveRecord 
     | 
|
| 
       1250 
1312 
     | 
    
         
             
                  end
         
     | 
| 
       1251 
1313 
     | 
    
         | 
| 
       1252 
1314 
     | 
    
         
             
                  def validate(migrations)
         
     | 
| 
       1253 
     | 
    
         
            -
                    name 
     | 
| 
      
 1315 
     | 
    
         
            +
                    name, = migrations.group_by(&:name).find { |_, v| v.length > 1 }
         
     | 
| 
       1254 
1316 
     | 
    
         
             
                    raise DuplicateMigrationNameError.new(name) if name
         
     | 
| 
       1255 
1317 
     | 
    
         | 
| 
       1256 
     | 
    
         
            -
                    version 
     | 
| 
      
 1318 
     | 
    
         
            +
                    version, = migrations.group_by(&:version).find { |_, v| v.length > 1 }
         
     | 
| 
       1257 
1319 
     | 
    
         
             
                    raise DuplicateMigrationVersionError.new(version) if version
         
     | 
| 
       1258 
1320 
     | 
    
         
             
                  end
         
     | 
| 
       1259 
1321 
     | 
    
         | 
| 
         @@ -1267,23 +1329,6 @@ module ActiveRecord 
     | 
|
| 
       1267 
1329 
     | 
    
         
             
                    end
         
     | 
| 
       1268 
1330 
     | 
    
         
             
                  end
         
     | 
| 
       1269 
1331 
     | 
    
         | 
| 
       1270 
     | 
    
         
            -
                  def self.last_stored_environment
         
     | 
| 
       1271 
     | 
    
         
            -
                    return nil if current_version == 0
         
     | 
| 
       1272 
     | 
    
         
            -
                    raise NoEnvironmentInSchemaError unless ActiveRecord::InternalMetadata.table_exists?
         
     | 
| 
       1273 
     | 
    
         
            -
             
     | 
| 
       1274 
     | 
    
         
            -
                    environment = ActiveRecord::InternalMetadata[:environment]
         
     | 
| 
       1275 
     | 
    
         
            -
                    raise NoEnvironmentInSchemaError unless environment
         
     | 
| 
       1276 
     | 
    
         
            -
                    environment
         
     | 
| 
       1277 
     | 
    
         
            -
                  end
         
     | 
| 
       1278 
     | 
    
         
            -
             
     | 
| 
       1279 
     | 
    
         
            -
                  def self.current_environment
         
     | 
| 
       1280 
     | 
    
         
            -
                    ActiveRecord::ConnectionHandling::DEFAULT_ENV.call
         
     | 
| 
       1281 
     | 
    
         
            -
                  end
         
     | 
| 
       1282 
     | 
    
         
            -
             
     | 
| 
       1283 
     | 
    
         
            -
                  def self.protected_environment?
         
     | 
| 
       1284 
     | 
    
         
            -
                    ActiveRecord::Base.protected_environments.include?(last_stored_environment) if last_stored_environment
         
     | 
| 
       1285 
     | 
    
         
            -
                  end
         
     | 
| 
       1286 
     | 
    
         
            -
             
     | 
| 
       1287 
1332 
     | 
    
         
             
                  def up?
         
     | 
| 
       1288 
1333 
     | 
    
         
             
                    @direction == :up
         
     | 
| 
       1289 
1334 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -1311,12 +1356,17 @@ module ActiveRecord 
     | 
|
| 
       1311 
1356 
     | 
    
         | 
| 
       1312 
1357 
     | 
    
         
             
                  def with_advisory_lock
         
     | 
| 
       1313 
1358 
     | 
    
         
             
                    lock_id = generate_migrator_advisory_lock_id
         
     | 
| 
       1314 
     | 
    
         
            -
                     
     | 
| 
      
 1359 
     | 
    
         
            +
                    connection = Base.connection
         
     | 
| 
      
 1360 
     | 
    
         
            +
                    got_lock = connection.get_advisory_lock(lock_id)
         
     | 
| 
       1315 
1361 
     | 
    
         
             
                    raise ConcurrentMigrationError unless got_lock
         
     | 
| 
       1316 
1362 
     | 
    
         
             
                    load_migrated # reload schema_migrations to be sure it wasn't changed by another process before we got the lock
         
     | 
| 
       1317 
1363 
     | 
    
         
             
                    yield
         
     | 
| 
       1318 
1364 
     | 
    
         
             
                  ensure
         
     | 
| 
       1319 
     | 
    
         
            -
                     
     | 
| 
      
 1365 
     | 
    
         
            +
                    if got_lock && !connection.release_advisory_lock(lock_id)
         
     | 
| 
      
 1366 
     | 
    
         
            +
                      raise ConcurrentMigrationError.new(
         
     | 
| 
      
 1367 
     | 
    
         
            +
                        ConcurrentMigrationError::RELEASE_LOCK_FAILED_MESSAGE
         
     | 
| 
      
 1368 
     | 
    
         
            +
                      )
         
     | 
| 
      
 1369 
     | 
    
         
            +
                    end
         
     | 
| 
       1320 
1370 
     | 
    
         
             
                  end
         
     | 
| 
       1321 
1371 
     | 
    
         | 
| 
       1322 
1372 
     | 
    
         
             
                  MIGRATOR_SALT = 2053462845
         
     | 
| 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            require "monitor"
         
     | 
| 
       2 
4 
     | 
    
         | 
| 
       3 
5 
     | 
    
         
             
            module ActiveRecord
         
     | 
| 
         @@ -103,20 +105,11 @@ module ActiveRecord 
     | 
|
| 
       103 
105 
     | 
    
         
             
                included do
         
     | 
| 
       104 
106 
     | 
    
         
             
                  mattr_accessor :primary_key_prefix_type, instance_writer: false
         
     | 
| 
       105 
107 
     | 
    
         | 
| 
       106 
     | 
    
         
            -
                  class_attribute :table_name_prefix, instance_writer: false
         
     | 
| 
       107 
     | 
    
         
            -
                   
     | 
| 
       108 
     | 
    
         
            -
             
     | 
| 
       109 
     | 
    
         
            -
                  class_attribute : 
     | 
| 
       110 
     | 
    
         
            -
                   
     | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
                  class_attribute :schema_migrations_table_name, instance_accessor: false
         
     | 
| 
       113 
     | 
    
         
            -
                  self.schema_migrations_table_name = "schema_migrations"
         
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
                  class_attribute :internal_metadata_table_name, instance_accessor: false
         
     | 
| 
       116 
     | 
    
         
            -
                  self.internal_metadata_table_name = "ar_internal_metadata"
         
     | 
| 
       117 
     | 
    
         
            -
             
     | 
| 
       118 
     | 
    
         
            -
                  class_attribute :pluralize_table_names, instance_writer: false
         
     | 
| 
       119 
     | 
    
         
            -
                  self.pluralize_table_names = true
         
     | 
| 
      
 108 
     | 
    
         
            +
                  class_attribute :table_name_prefix, instance_writer: false, default: ""
         
     | 
| 
      
 109 
     | 
    
         
            +
                  class_attribute :table_name_suffix, instance_writer: false, default: ""
         
     | 
| 
      
 110 
     | 
    
         
            +
                  class_attribute :schema_migrations_table_name, instance_accessor: false, default: "schema_migrations"
         
     | 
| 
      
 111 
     | 
    
         
            +
                  class_attribute :internal_metadata_table_name, instance_accessor: false, default: "ar_internal_metadata"
         
     | 
| 
      
 112 
     | 
    
         
            +
                  class_attribute :pluralize_table_names, instance_writer: false, default: true
         
     | 
| 
       120 
113 
     | 
    
         | 
| 
       121 
114 
     | 
    
         
             
                  self.protected_environments = ["production"]
         
     | 
| 
       122 
115 
     | 
    
         
             
                  self.inheritance_column = "type"
         
     | 
| 
         @@ -332,11 +325,11 @@ module ActiveRecord 
     | 
|
| 
       332 
325 
     | 
    
         
             
                  end
         
     | 
| 
       333 
326 
     | 
    
         | 
| 
       334 
327 
     | 
    
         
             
                  def attributes_builder # :nodoc:
         
     | 
| 
       335 
     | 
    
         
            -
                    @attributes_builder 
     | 
| 
       336 
     | 
    
         
            -
                       
     | 
| 
       337 
     | 
    
         
            -
             
     | 
| 
       338 
     | 
    
         
            -
                      end
         
     | 
| 
      
 328 
     | 
    
         
            +
                    unless defined?(@attributes_builder) && @attributes_builder
         
     | 
| 
      
 329 
     | 
    
         
            +
                      defaults = _default_attributes.except(*(column_names - [primary_key]))
         
     | 
| 
      
 330 
     | 
    
         
            +
                      @attributes_builder = ActiveModel::AttributeSet::Builder.new(attribute_types, defaults)
         
     | 
| 
       339 
331 
     | 
    
         
             
                    end
         
     | 
| 
      
 332 
     | 
    
         
            +
                    @attributes_builder
         
     | 
| 
       340 
333 
     | 
    
         
             
                  end
         
     | 
| 
       341 
334 
     | 
    
         | 
| 
       342 
335 
     | 
    
         
             
                  def columns_hash # :nodoc:
         
     | 
| 
         @@ -355,7 +348,7 @@ module ActiveRecord 
     | 
|
| 
       355 
348 
     | 
    
         
             
                  end
         
     | 
| 
       356 
349 
     | 
    
         | 
| 
       357 
350 
     | 
    
         
             
                  def yaml_encoder # :nodoc:
         
     | 
| 
       358 
     | 
    
         
            -
                    @yaml_encoder ||= AttributeSet::YAMLEncoder.new(attribute_types)
         
     | 
| 
      
 351 
     | 
    
         
            +
                    @yaml_encoder ||= ActiveModel::AttributeSet::YAMLEncoder.new(attribute_types)
         
     | 
| 
       359 
352 
     | 
    
         
             
                  end
         
     | 
| 
       360 
353 
     | 
    
         | 
| 
       361 
354 
     | 
    
         
             
                  # Returns the type of the attribute with the given name, after applying
         
     | 
| 
         @@ -368,8 +361,9 @@ module ActiveRecord 
     | 
|
| 
       368 
361 
     | 
    
         
             
                  # it).
         
     | 
| 
       369 
362 
     | 
    
         
             
                  #
         
     | 
| 
       370 
363 
     | 
    
         
             
                  # +attr_name+ The name of the attribute to retrieve the type for. Must be
         
     | 
| 
       371 
     | 
    
         
            -
                  # a string
         
     | 
| 
      
 364 
     | 
    
         
            +
                  # a string or a symbol.
         
     | 
| 
       372 
365 
     | 
    
         
             
                  def type_for_attribute(attr_name, &block)
         
     | 
| 
      
 366 
     | 
    
         
            +
                    attr_name = attr_name.to_s
         
     | 
| 
       373 
367 
     | 
    
         
             
                    if block
         
     | 
| 
       374 
368 
     | 
    
         
             
                      attribute_types.fetch(attr_name, &block)
         
     | 
| 
       375 
369 
     | 
    
         
             
                    else
         
     | 
| 
         @@ -381,11 +375,12 @@ module ActiveRecord 
     | 
|
| 
       381 
375 
     | 
    
         
             
                  # default values when instantiating the Active Record object for this table.
         
     | 
| 
       382 
376 
     | 
    
         
             
                  def column_defaults
         
     | 
| 
       383 
377 
     | 
    
         
             
                    load_schema
         
     | 
| 
       384 
     | 
    
         
            -
                    _default_attributes.to_hash
         
     | 
| 
      
 378 
     | 
    
         
            +
                    @column_defaults ||= _default_attributes.to_hash
         
     | 
| 
       385 
379 
     | 
    
         
             
                  end
         
     | 
| 
       386 
380 
     | 
    
         | 
| 
       387 
381 
     | 
    
         
             
                  def _default_attributes # :nodoc:
         
     | 
| 
       388 
     | 
    
         
            -
                     
     | 
| 
      
 382 
     | 
    
         
            +
                    load_schema
         
     | 
| 
      
 383 
     | 
    
         
            +
                    @default_attributes ||= ActiveModel::AttributeSet.new({})
         
     | 
| 
       389 
384 
     | 
    
         
             
                  end
         
     | 
| 
       390 
385 
     | 
    
         | 
| 
       391 
386 
     | 
    
         
             
                  # Returns an array of column names as strings.
         
     | 
| 
         @@ -432,7 +427,7 @@ module ActiveRecord 
     | 
|
| 
       432 
427 
     | 
    
         
             
                  #  end
         
     | 
| 
       433 
428 
     | 
    
         
             
                  def reset_column_information
         
     | 
| 
       434 
429 
     | 
    
         
             
                    connection.clear_cache!
         
     | 
| 
       435 
     | 
    
         
            -
                    undefine_attribute_methods
         
     | 
| 
      
 430 
     | 
    
         
            +
                    ([self] + descendants).each(&:undefine_attribute_methods)
         
     | 
| 
       436 
431 
     | 
    
         
             
                    connection.schema_cache.clear_data_source_cache!(table_name)
         
     | 
| 
       437 
432 
     | 
    
         | 
| 
       438 
433 
     | 
    
         
             
                    reload_schema_from_cache
         
     | 
| 
         @@ -480,12 +475,12 @@ module ActiveRecord 
     | 
|
| 
       480 
475 
     | 
    
         
             
                    end
         
     | 
| 
       481 
476 
     | 
    
         | 
| 
       482 
477 
     | 
    
         
             
                    def reload_schema_from_cache
         
     | 
| 
       483 
     | 
    
         
            -
                      @arel_engine = nil
         
     | 
| 
       484 
478 
     | 
    
         
             
                      @arel_table = nil
         
     | 
| 
       485 
479 
     | 
    
         
             
                      @column_names = nil
         
     | 
| 
       486 
480 
     | 
    
         
             
                      @attribute_types = nil
         
     | 
| 
       487 
481 
     | 
    
         
             
                      @content_columns = nil
         
     | 
| 
       488 
482 
     | 
    
         
             
                      @default_attributes = nil
         
     | 
| 
      
 483 
     | 
    
         
            +
                      @column_defaults = nil
         
     | 
| 
       489 
484 
     | 
    
         
             
                      @inheritance_column = nil unless defined?(@explicit_inheritance_column) && @explicit_inheritance_column
         
     | 
| 
       490 
485 
     | 
    
         
             
                      @attributes_builder = nil
         
     | 
| 
       491 
486 
     | 
    
         
             
                      @columns = nil
         
     | 
| 
         @@ -1,4 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            require "active_support/core_ext/hash/except"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "active_support/core_ext/module/redefine_method"
         
     | 
| 
       2 
5 
     | 
    
         
             
            require "active_support/core_ext/object/try"
         
     | 
| 
       3 
6 
     | 
    
         
             
            require "active_support/core_ext/hash/indifferent_access"
         
     | 
| 
       4 
7 
     | 
    
         | 
| 
         @@ -10,8 +13,7 @@ module ActiveRecord 
     | 
|
| 
       10 
13 
     | 
    
         
             
                extend ActiveSupport::Concern
         
     | 
| 
       11 
14 
     | 
    
         | 
| 
       12 
15 
     | 
    
         
             
                included do
         
     | 
| 
       13 
     | 
    
         
            -
                  class_attribute :nested_attributes_options, instance_writer: false
         
     | 
| 
       14 
     | 
    
         
            -
                  self.nested_attributes_options = {}
         
     | 
| 
      
 16 
     | 
    
         
            +
                  class_attribute :nested_attributes_options, instance_writer: false, default: {}
         
     | 
| 
       15 
17 
     | 
    
         
             
                end
         
     | 
| 
       16 
18 
     | 
    
         | 
| 
       17 
19 
     | 
    
         
             
                # = Active Record Nested Attributes
         
     | 
| 
         @@ -61,6 +63,18 @@ module ActiveRecord 
     | 
|
| 
       61 
63 
     | 
    
         
             
                #   member.update params[:member]
         
     | 
| 
       62 
64 
     | 
    
         
             
                #   member.avatar.icon # => 'sad'
         
     | 
| 
       63 
65 
     | 
    
         
             
                #
         
     | 
| 
      
 66 
     | 
    
         
            +
                # If you want to update the current avatar without providing the id, you must add <tt>:update_only</tt> option.
         
     | 
| 
      
 67 
     | 
    
         
            +
                #
         
     | 
| 
      
 68 
     | 
    
         
            +
                #   class Member < ActiveRecord::Base
         
     | 
| 
      
 69 
     | 
    
         
            +
                #     has_one :avatar
         
     | 
| 
      
 70 
     | 
    
         
            +
                #     accepts_nested_attributes_for :avatar, update_only: true
         
     | 
| 
      
 71 
     | 
    
         
            +
                #   end
         
     | 
| 
      
 72 
     | 
    
         
            +
                #
         
     | 
| 
      
 73 
     | 
    
         
            +
                #   params = { member: { avatar_attributes: { icon: 'sad' } } }
         
     | 
| 
      
 74 
     | 
    
         
            +
                #   member.update params[:member]
         
     | 
| 
      
 75 
     | 
    
         
            +
                #   member.avatar.id # => 2
         
     | 
| 
      
 76 
     | 
    
         
            +
                #   member.avatar.icon # => 'sad'
         
     | 
| 
      
 77 
     | 
    
         
            +
                #
         
     | 
| 
       64 
78 
     | 
    
         
             
                # By default you will only be able to set and update attributes on the
         
     | 
| 
       65 
79 
     | 
    
         
             
                # associated model. If you want to destroy the associated model through the
         
     | 
| 
       66 
80 
     | 
    
         
             
                # attributes hash, you have to enable it first using the
         
     | 
| 
         @@ -354,9 +368,7 @@ module ActiveRecord 
     | 
|
| 
       354 
368 
     | 
    
         
             
                    # associations are just regular associations.
         
     | 
| 
       355 
369 
     | 
    
         
             
                    def generate_association_writer(association_name, type)
         
     | 
| 
       356 
370 
     | 
    
         
             
                      generated_association_methods.module_eval <<-eoruby, __FILE__, __LINE__ + 1
         
     | 
| 
       357 
     | 
    
         
            -
                         
     | 
| 
       358 
     | 
    
         
            -
                          remove_method(:#{association_name}_attributes=)
         
     | 
| 
       359 
     | 
    
         
            -
                        end
         
     | 
| 
      
 371 
     | 
    
         
            +
                        silence_redefinition_of_method :#{association_name}_attributes=
         
     | 
| 
       360 
372 
     | 
    
         
             
                        def #{association_name}_attributes=(attributes)
         
     | 
| 
       361 
373 
     | 
    
         
             
                          assign_nested_attributes_for_#{type}_association(:#{association_name}, attributes)
         
     | 
| 
       362 
374 
     | 
    
         
             
                        end
         
     | 
| 
         @@ -458,7 +470,7 @@ module ActiveRecord 
     | 
|
| 
       458 
470 
     | 
    
         
             
                    end
         
     | 
| 
       459 
471 
     | 
    
         | 
| 
       460 
472 
     | 
    
         
             
                    unless attributes_collection.is_a?(Hash) || attributes_collection.is_a?(Array)
         
     | 
| 
       461 
     | 
    
         
            -
                      raise ArgumentError, "Hash or Array expected 
     | 
| 
      
 473 
     | 
    
         
            +
                      raise ArgumentError, "Hash or Array expected for attribute `#{association_name}`, got #{attributes_collection.class.name} (#{attributes_collection.inspect})"
         
     | 
| 
       462 
474 
     | 
    
         
             
                    end
         
     | 
| 
       463 
475 
     | 
    
         | 
| 
       464 
476 
     | 
    
         
             
                    check_record_limit!(options[:limit], attributes_collection)
         
     | 
| 
         @@ -1,10 +1,12 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            module ActiveRecord
         
     | 
| 
       2 
4 
     | 
    
         
             
              # = Active Record No Touching
         
     | 
| 
       3 
5 
     | 
    
         
             
              module NoTouching
         
     | 
| 
       4 
6 
     | 
    
         
             
                extend ActiveSupport::Concern
         
     | 
| 
       5 
7 
     | 
    
         | 
| 
       6 
8 
     | 
    
         
             
                module ClassMethods
         
     | 
| 
       7 
     | 
    
         
            -
                  # Lets you selectively disable calls to  
     | 
| 
      
 9 
     | 
    
         
            +
                  # Lets you selectively disable calls to +touch+ for the
         
     | 
| 
       8 
10 
     | 
    
         
             
                  # duration of a block.
         
     | 
| 
       9 
11 
     | 
    
         
             
                  #
         
     | 
| 
       10 
12 
     | 
    
         
             
                  # ==== Examples
         
     |