activerecord 3.2.6 → 6.0.0
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 +7 -0
- data/CHANGELOG.md +611 -6417
- data/MIT-LICENSE +4 -2
- data/README.rdoc +44 -47
- data/examples/performance.rb +79 -71
- data/examples/simple.rb +6 -5
- data/lib/active_record/aggregations.rb +268 -238
- data/lib/active_record/association_relation.rb +40 -0
- data/lib/active_record/associations/alias_tracker.rb +47 -42
- data/lib/active_record/associations/association.rb +173 -81
- data/lib/active_record/associations/association_scope.rb +124 -92
- data/lib/active_record/associations/belongs_to_association.rb +83 -38
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +11 -9
- data/lib/active_record/associations/builder/association.rb +113 -32
- data/lib/active_record/associations/builder/belongs_to.rb +105 -60
- data/lib/active_record/associations/builder/collection_association.rb +53 -56
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +98 -41
- data/lib/active_record/associations/builder/has_many.rb +11 -63
- data/lib/active_record/associations/builder/has_one.rb +47 -45
- data/lib/active_record/associations/builder/singular_association.rb +30 -18
- data/lib/active_record/associations/collection_association.rb +217 -295
- data/lib/active_record/associations/collection_proxy.rb +1074 -77
- data/lib/active_record/associations/foreign_association.rb +20 -0
- data/lib/active_record/associations/has_many_association.rb +78 -50
- data/lib/active_record/associations/has_many_through_association.rb +99 -61
- data/lib/active_record/associations/has_one_association.rb +75 -30
- data/lib/active_record/associations/has_one_through_association.rb +20 -11
- data/lib/active_record/associations/join_dependency/join_association.rb +45 -119
- data/lib/active_record/associations/join_dependency/join_base.rb +11 -12
- data/lib/active_record/associations/join_dependency/join_part.rb +35 -42
- data/lib/active_record/associations/join_dependency.rb +208 -164
- data/lib/active_record/associations/preloader/association.rb +93 -87
- data/lib/active_record/associations/preloader/through_association.rb +87 -38
- data/lib/active_record/associations/preloader.rb +134 -110
- data/lib/active_record/associations/singular_association.rb +19 -24
- data/lib/active_record/associations/through_association.rb +61 -27
- data/lib/active_record/associations.rb +1766 -1505
- data/lib/active_record/attribute_assignment.rb +57 -193
- data/lib/active_record/attribute_decorators.rb +90 -0
- data/lib/active_record/attribute_methods/before_type_cast.rb +58 -8
- data/lib/active_record/attribute_methods/dirty.rb +187 -67
- data/lib/active_record/attribute_methods/primary_key.rb +100 -78
- data/lib/active_record/attribute_methods/query.rb +10 -8
- data/lib/active_record/attribute_methods/read.rb +29 -118
- data/lib/active_record/attribute_methods/serialization.rb +60 -72
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +69 -42
- data/lib/active_record/attribute_methods/write.rb +36 -44
- data/lib/active_record/attribute_methods.rb +306 -161
- data/lib/active_record/attributes.rb +279 -0
- data/lib/active_record/autosave_association.rb +324 -238
- data/lib/active_record/base.rb +114 -507
- data/lib/active_record/callbacks.rb +147 -83
- data/lib/active_record/coders/json.rb +15 -0
- data/lib/active_record/coders/yaml_column.rb +32 -23
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +962 -279
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +32 -5
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +331 -209
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +95 -23
- data/lib/active_record/connection_adapters/abstract/quoting.rb +201 -65
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +23 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -0
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +510 -289
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +93 -0
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1182 -313
- data/lib/active_record/connection_adapters/abstract/transaction.rb +323 -0
- data/lib/active_record/connection_adapters/abstract_adapter.rb +585 -120
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +610 -463
- data/lib/active_record/connection_adapters/column.rb +58 -233
- data/lib/active_record/connection_adapters/connection_specification.rb +297 -0
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +200 -0
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +72 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +72 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +75 -207
- data/lib/active_record/connection_adapters/postgresql/column.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +182 -0
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +92 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +53 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +17 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +50 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +21 -0
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +71 -0
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +41 -0
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +65 -0
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +97 -0
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +18 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +113 -0
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +26 -0
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +28 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +34 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +205 -0
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +43 -0
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +222 -0
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +50 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +776 -0
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +81 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +695 -1052
- data/lib/active_record/connection_adapters/schema_cache.rb +115 -24
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +118 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +103 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
- 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 +528 -26
- data/lib/active_record/connection_adapters/statement_pool.rb +34 -13
- data/lib/active_record/connection_handling.rb +267 -0
- data/lib/active_record/core.rb +599 -0
- data/lib/active_record/counter_cache.rb +177 -103
- 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 +79 -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 +107 -64
- data/lib/active_record/enum.rb +274 -0
- data/lib/active_record/errors.rb +254 -61
- data/lib/active_record/explain.rb +35 -70
- data/lib/active_record/explain_registry.rb +32 -0
- data/lib/active_record/explain_subscriber.rb +18 -8
- data/lib/active_record/fixture_set/file.rb +82 -0
- 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 +153 -0
- data/lib/active_record/fixture_set/table_rows.rb +47 -0
- data/lib/active_record/fixtures.rb +291 -475
- data/lib/active_record/gem_version.rb +17 -0
- data/lib/active_record/inheritance.rb +219 -100
- data/lib/active_record/insert_all.rb +179 -0
- data/lib/active_record/integration.rb +175 -17
- data/lib/active_record/internal_metadata.rb +53 -0
- data/lib/active_record/legacy_yaml_adapter.rb +48 -0
- data/lib/active_record/locale/en.yml +9 -1
- data/lib/active_record/locking/optimistic.rb +106 -92
- data/lib/active_record/locking/pessimistic.rb +23 -11
- data/lib/active_record/log_subscriber.rb +80 -30
- data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
- data/lib/active_record/middleware/database_selector.rb +75 -0
- data/lib/active_record/migration/command_recorder.rb +235 -56
- data/lib/active_record/migration/compatibility.rb +244 -0
- data/lib/active_record/migration/join_table.rb +17 -0
- data/lib/active_record/migration.rb +917 -301
- data/lib/active_record/model_schema.rb +351 -175
- data/lib/active_record/nested_attributes.rb +366 -235
- data/lib/active_record/no_touching.rb +65 -0
- data/lib/active_record/null_relation.rb +68 -0
- data/lib/active_record/persistence.rb +761 -166
- data/lib/active_record/query_cache.rb +22 -44
- data/lib/active_record/querying.rb +55 -31
- data/lib/active_record/railtie.rb +185 -47
- data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
- data/lib/active_record/railties/console_sandbox.rb +5 -4
- data/lib/active_record/railties/controller_runtime.rb +35 -33
- data/lib/active_record/railties/databases.rake +366 -463
- data/lib/active_record/readonly_attributes.rb +4 -6
- data/lib/active_record/reflection.rb +736 -228
- data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
- data/lib/active_record/relation/batches.rb +252 -52
- data/lib/active_record/relation/calculations.rb +340 -270
- data/lib/active_record/relation/delegation.rb +117 -36
- data/lib/active_record/relation/finder_methods.rb +439 -286
- data/lib/active_record/relation/from_clause.rb +26 -0
- data/lib/active_record/relation/merger.rb +184 -0
- data/lib/active_record/relation/predicate_builder/array_handler.rb +49 -0
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +19 -0
- data/lib/active_record/relation/predicate_builder.rb +131 -39
- data/lib/active_record/relation/query_attribute.rb +50 -0
- data/lib/active_record/relation/query_methods.rb +1163 -221
- data/lib/active_record/relation/record_fetch_warning.rb +51 -0
- data/lib/active_record/relation/spawn_methods.rb +49 -120
- data/lib/active_record/relation/where_clause.rb +190 -0
- data/lib/active_record/relation/where_clause_factory.rb +33 -0
- data/lib/active_record/relation.rb +671 -349
- data/lib/active_record/result.rb +149 -15
- data/lib/active_record/runtime_registry.rb +24 -0
- data/lib/active_record/sanitization.rb +153 -133
- data/lib/active_record/schema.rb +22 -19
- data/lib/active_record/schema_dumper.rb +178 -112
- data/lib/active_record/schema_migration.rb +60 -0
- data/lib/active_record/scoping/default.rb +107 -98
- data/lib/active_record/scoping/named.rb +130 -115
- data/lib/active_record/scoping.rb +77 -123
- data/lib/active_record/secure_token.rb +40 -0
- data/lib/active_record/serialization.rb +10 -6
- data/lib/active_record/statement_cache.rb +148 -0
- data/lib/active_record/store.rb +256 -16
- data/lib/active_record/suppressor.rb +61 -0
- data/lib/active_record/table_metadata.rb +75 -0
- data/lib/active_record/tasks/database_tasks.rb +506 -0
- data/lib/active_record/tasks/mysql_database_tasks.rb +115 -0
- data/lib/active_record/tasks/postgresql_database_tasks.rb +141 -0
- data/lib/active_record/tasks/sqlite_database_tasks.rb +77 -0
- data/lib/active_record/test_databases.rb +23 -0
- data/lib/active_record/test_fixtures.rb +224 -0
- data/lib/active_record/timestamp.rb +93 -39
- data/lib/active_record/touch_later.rb +66 -0
- data/lib/active_record/transactions.rb +260 -129
- data/lib/active_record/translation.rb +3 -1
- data/lib/active_record/type/adapter_specific_registry.rb +129 -0
- data/lib/active_record/type/date.rb +9 -0
- data/lib/active_record/type/date_time.rb +9 -0
- data/lib/active_record/type/decimal_without_scale.rb +15 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +25 -0
- data/lib/active_record/type/internal/timezone.rb +17 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +71 -0
- data/lib/active_record/type/text.rb +11 -0
- data/lib/active_record/type/time.rb +21 -0
- data/lib/active_record/type/type_map.rb +62 -0
- data/lib/active_record/type/unsigned_integer.rb +17 -0
- data/lib/active_record/type.rb +78 -0
- data/lib/active_record/type_caster/connection.rb +34 -0
- data/lib/active_record/type_caster/map.rb +20 -0
- data/lib/active_record/type_caster.rb +9 -0
- data/lib/active_record/validations/absence.rb +25 -0
- data/lib/active_record/validations/associated.rb +35 -18
- data/lib/active_record/validations/length.rb +26 -0
- data/lib/active_record/validations/presence.rb +68 -0
- data/lib/active_record/validations/uniqueness.rb +123 -77
- data/lib/active_record/validations.rb +54 -43
- data/lib/active_record/version.rb +7 -7
- data/lib/active_record.rb +97 -49
- 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 +257 -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 +204 -0
- data/lib/arel/visitors/dot.rb +297 -0
- data/lib/arel/visitors/ibm_db.rb +34 -0
- data/lib/arel/visitors/informix.rb +62 -0
- data/lib/arel/visitors/mssql.rb +157 -0
- data/lib/arel/visitors/mysql.rb +83 -0
- data/lib/arel/visitors/oracle.rb +159 -0
- data/lib/arel/visitors/oracle12.rb +66 -0
- data/lib/arel/visitors/postgresql.rb +110 -0
- data/lib/arel/visitors/sqlite.rb +39 -0
- data/lib/arel/visitors/to_sql.rb +889 -0
- data/lib/arel/visitors/visitor.rb +46 -0
- data/lib/arel/visitors/where_sql.rb +23 -0
- data/lib/arel/visitors.rb +20 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +51 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +59 -9
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +48 -0
- data/lib/rails/generators/active_record/migration.rb +41 -8
- data/lib/rails/generators/active_record/model/model_generator.rb +24 -22
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
- data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +1 -1
- data/lib/rails/generators/active_record.rb +10 -16
- metadata +285 -149
- data/examples/associations.png +0 -0
- data/lib/active_record/associations/has_and_belongs_to_many_association.rb +0 -63
- data/lib/active_record/associations/join_helper.rb +0 -55
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
- data/lib/active_record/associations/preloader/collection_association.rb +0 -24
- data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +0 -60
- data/lib/active_record/associations/preloader/has_many.rb +0 -17
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -15
- data/lib/active_record/associations/preloader/has_one.rb +0 -23
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -21
- data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +0 -32
- data/lib/active_record/connection_adapters/abstract/connection_specification.rb +0 -188
- data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -426
- data/lib/active_record/connection_adapters/sqlite_adapter.rb +0 -579
- data/lib/active_record/dynamic_finder_match.rb +0 -68
- data/lib/active_record/dynamic_scope_match.rb +0 -23
- data/lib/active_record/fixtures/file.rb +0 -65
- data/lib/active_record/identity_map.rb +0 -162
- data/lib/active_record/observer.rb +0 -121
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/serializers/xml_serializer.rb +0 -203
- data/lib/active_record/session_store.rb +0 -358
- data/lib/active_record/test_case.rb +0 -73
- data/lib/rails/generators/active_record/migration/templates/migration.rb +0 -34
- data/lib/rails/generators/active_record/model/templates/migration.rb +0 -15
- data/lib/rails/generators/active_record/model/templates/model.rb +0 -12
- data/lib/rails/generators/active_record/observer/observer_generator.rb +0 -15
- data/lib/rails/generators/active_record/observer/templates/observer.rb +0 -4
- data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +0 -25
- data/lib/rails/generators/active_record/session_migration/templates/migration.rb +0 -12
data/MIT-LICENSE
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
Copyright (c) 2004-
|
1
|
+
Copyright (c) 2004-2019 David Heinemeier Hansson
|
2
|
+
|
3
|
+
Arel originally copyright (c) 2007-2016 Nick Kallen, Bryan Helmkamp, Emilio Tagua, Aaron Patterson
|
2
4
|
|
3
5
|
Permission is hereby granted, free of charge, to any person obtaining
|
4
6
|
a copy of this software and associated documentation files (the
|
@@ -17,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
19
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
20
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
21
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
= Active Record -- Object-relational mapping
|
1
|
+
= Active Record -- Object-relational mapping in Rails
|
2
2
|
|
3
3
|
Active Record connects classes to relational database tables to establish an
|
4
4
|
almost zero-configuration persistence layer for applications. The library
|
@@ -13,6 +13,8 @@ columns. Although these mappings can be defined explicitly, it's recommended
|
|
13
13
|
to follow naming conventions, especially when getting started with the
|
14
14
|
library.
|
15
15
|
|
16
|
+
You can read more about Active Record in the {Active Record Basics}[https://edgeguides.rubyonrails.org/active_record_basics.html] guide.
|
17
|
+
|
16
18
|
A short rundown of some of the major features:
|
17
19
|
|
18
20
|
* Automated mapping between classes and tables, attributes and columns.
|
@@ -20,19 +22,19 @@ A short rundown of some of the major features:
|
|
20
22
|
class Product < ActiveRecord::Base
|
21
23
|
end
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
+
{Learn more}[link:classes/ActiveRecord/Base.html]
|
26
|
+
|
27
|
+
The Product class is automatically mapped to the table named "products",
|
28
|
+
which might look like this:
|
25
29
|
|
26
30
|
CREATE TABLE products (
|
27
|
-
id
|
31
|
+
id bigint NOT NULL auto_increment,
|
28
32
|
name varchar(255),
|
29
33
|
PRIMARY KEY (id)
|
30
34
|
);
|
31
35
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
{Learn more}[link:classes/ActiveRecord/Base.html]
|
36
|
+
This would also define the following accessors: <tt>Product#name</tt> and
|
37
|
+
<tt>Product#name=(new_name)</tt>.
|
36
38
|
|
37
39
|
|
38
40
|
* Associations between objects defined by simple class methods.
|
@@ -49,10 +51,10 @@ A short rundown of some of the major features:
|
|
49
51
|
* Aggregations of value objects.
|
50
52
|
|
51
53
|
class Account < ActiveRecord::Base
|
52
|
-
composed_of :balance, :
|
53
|
-
:
|
54
|
+
composed_of :balance, class_name: 'Money',
|
55
|
+
mapping: %w(balance amount)
|
54
56
|
composed_of :address,
|
55
|
-
:
|
57
|
+
mapping: [%w(address_street street), %w(address_city city)]
|
56
58
|
end
|
57
59
|
|
58
60
|
{Learn more}[link:classes/ActiveRecord/Aggregations/ClassMethods.html]
|
@@ -61,10 +63,10 @@ A short rundown of some of the major features:
|
|
61
63
|
* Validation rules that can differ for new or existing objects.
|
62
64
|
|
63
65
|
class Account < ActiveRecord::Base
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
66
|
+
validates :subdomain, :name, :email_address, :password, presence: true
|
67
|
+
validates :subdomain, uniqueness: true
|
68
|
+
validates :terms_of_service, acceptance: true, on: :create
|
69
|
+
validates :password, :email_address, confirmation: true, on: :create
|
68
70
|
end
|
69
71
|
|
70
72
|
{Learn more}[link:classes/ActiveRecord/Validations.html]
|
@@ -80,17 +82,6 @@ A short rundown of some of the major features:
|
|
80
82
|
{Learn more}[link:classes/ActiveRecord/Callbacks.html]
|
81
83
|
|
82
84
|
|
83
|
-
* Observers that react to changes in a model.
|
84
|
-
|
85
|
-
class CommentObserver < ActiveRecord::Observer
|
86
|
-
def after_create(comment) # is called just after Comment#save
|
87
|
-
CommentMailer.new_comment_email("david@loudthinking.com", comment).deliver
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
{Learn more}[link:classes/ActiveRecord/Observer.html]
|
92
|
-
|
93
|
-
|
94
85
|
* Inheritance hierarchies.
|
95
86
|
|
96
87
|
class Company < ActiveRecord::Base; end
|
@@ -124,32 +115,32 @@ A short rundown of some of the major features:
|
|
124
115
|
* Database abstraction through simple adapters.
|
125
116
|
|
126
117
|
# connect to SQLite3
|
127
|
-
ActiveRecord::Base.establish_connection(:
|
118
|
+
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'dbfile.sqlite3')
|
128
119
|
|
129
120
|
# connect to MySQL with authentication
|
130
121
|
ActiveRecord::Base.establish_connection(
|
131
|
-
:
|
132
|
-
:
|
133
|
-
:
|
134
|
-
:
|
135
|
-
:
|
122
|
+
adapter: 'mysql2',
|
123
|
+
host: 'localhost',
|
124
|
+
username: 'me',
|
125
|
+
password: 'secret',
|
126
|
+
database: 'activerecord'
|
136
127
|
)
|
137
128
|
|
138
129
|
{Learn more}[link:classes/ActiveRecord/Base.html] and read about the built-in support for
|
139
|
-
MySQL[link:classes/ActiveRecord/ConnectionAdapters/
|
130
|
+
MySQL[link:classes/ActiveRecord/ConnectionAdapters/Mysql2Adapter.html],
|
140
131
|
PostgreSQL[link:classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html], and
|
141
132
|
SQLite3[link:classes/ActiveRecord/ConnectionAdapters/SQLite3Adapter.html].
|
142
133
|
|
143
134
|
|
144
|
-
* Logging support for Log4r[
|
135
|
+
* Logging support for Log4r[https://github.com/colbygk/log4r] and Logger[http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc].
|
145
136
|
|
146
|
-
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
147
|
-
ActiveRecord::Base.logger = Log4r::Logger.new(
|
137
|
+
ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT)
|
138
|
+
ActiveRecord::Base.logger = Log4r::Logger.new('Application Log')
|
148
139
|
|
149
140
|
|
150
141
|
* Database agnostic schema management with Migrations.
|
151
142
|
|
152
|
-
class AddSystemSettings < ActiveRecord::Migration
|
143
|
+
class AddSystemSettings < ActiveRecord::Migration[5.0]
|
153
144
|
def up
|
154
145
|
create_table :system_settings do |t|
|
155
146
|
t.string :name
|
@@ -159,7 +150,7 @@ A short rundown of some of the major features:
|
|
159
150
|
t.integer :position
|
160
151
|
end
|
161
152
|
|
162
|
-
SystemSetting.create :
|
153
|
+
SystemSetting.create name: 'notice', label: 'Use notice?', value: 1
|
163
154
|
end
|
164
155
|
|
165
156
|
def down
|
@@ -173,7 +164,7 @@ A short rundown of some of the major features:
|
|
173
164
|
== Philosophy
|
174
165
|
|
175
166
|
Active Record is an implementation of the object-relational mapping (ORM)
|
176
|
-
pattern[
|
167
|
+
pattern[https://www.martinfowler.com/eaaCatalog/activeRecord.html] by the same
|
177
168
|
name described by Martin Fowler:
|
178
169
|
|
179
170
|
"An object that wraps a row in a database table or view,
|
@@ -186,7 +177,7 @@ by relying on a number of conventions that make it easy for Active Record to inf
|
|
186
177
|
complex relations and structures from a minimal amount of explicit direction.
|
187
178
|
|
188
179
|
Convention over Configuration:
|
189
|
-
* No XML
|
180
|
+
* No XML files!
|
190
181
|
* Lots of reflection and run-time extension
|
191
182
|
* Magic is not inherently a bad word
|
192
183
|
|
@@ -199,24 +190,30 @@ Admit the Database:
|
|
199
190
|
|
200
191
|
The latest version of Active Record can be installed with RubyGems:
|
201
192
|
|
202
|
-
|
193
|
+
$ gem install activerecord
|
203
194
|
|
204
|
-
Source code can be downloaded as part of the Rails project on GitHub
|
195
|
+
Source code can be downloaded as part of the Rails project on GitHub:
|
205
196
|
|
206
|
-
* https://github.com/rails/rails/tree/
|
197
|
+
* https://github.com/rails/rails/tree/master/activerecord
|
207
198
|
|
208
199
|
|
209
200
|
== License
|
210
201
|
|
211
|
-
Active Record is released under the MIT license
|
202
|
+
Active Record is released under the MIT license:
|
203
|
+
|
204
|
+
* https://opensource.org/licenses/MIT
|
212
205
|
|
213
206
|
|
214
207
|
== Support
|
215
208
|
|
216
|
-
API documentation is at
|
209
|
+
API documentation is at:
|
217
210
|
|
218
|
-
*
|
211
|
+
* https://api.rubyonrails.org
|
219
212
|
|
220
|
-
Bug reports
|
213
|
+
Bug reports for the Ruby on Rails project can be filed here:
|
221
214
|
|
222
215
|
* https://github.com/rails/rails/issues
|
216
|
+
|
217
|
+
Feature requests should be discussed on the rails-core mailing list here:
|
218
|
+
|
219
|
+
* https://groups.google.com/forum/?fromgroups#!forum/rubyonrails-core
|
data/examples/performance.rb
CHANGED
@@ -1,14 +1,17 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require File.expand_path('../../../load_paths', __FILE__)
|
4
3
|
require "active_record"
|
4
|
+
require "benchmark/ips"
|
5
5
|
|
6
|
-
|
6
|
+
TIME = (ENV["BENCHMARK_TIME"] || 20).to_i
|
7
|
+
RECORDS = (ENV["BENCHMARK_RECORDS"] || TIME * 1000).to_i
|
8
|
+
|
9
|
+
conn = { adapter: "sqlite3", database: ":memory:" }
|
7
10
|
|
8
11
|
ActiveRecord::Base.establish_connection(conn)
|
9
12
|
|
10
13
|
class User < ActiveRecord::Base
|
11
|
-
connection.create_table :users, :
|
14
|
+
connection.create_table :users, force: true do |t|
|
12
15
|
t.string :name, :email
|
13
16
|
t.timestamps
|
14
17
|
end
|
@@ -17,7 +20,7 @@ class User < ActiveRecord::Base
|
|
17
20
|
end
|
18
21
|
|
19
22
|
class Exhibit < ActiveRecord::Base
|
20
|
-
connection.create_table :exhibits, :
|
23
|
+
connection.create_table :exhibits, force: true do |t|
|
21
24
|
t.belongs_to :user
|
22
25
|
t.string :name
|
23
26
|
t.text :notes
|
@@ -37,28 +40,30 @@ class Exhibit < ActiveRecord::Base
|
|
37
40
|
where("notes IS NOT NULL")
|
38
41
|
end
|
39
42
|
|
40
|
-
def self.look(exhibits) exhibits.each
|
41
|
-
def self.feel(exhibits) exhibits.each
|
43
|
+
def self.look(exhibits) exhibits.each(&:look) end
|
44
|
+
def self.feel(exhibits) exhibits.each(&:feel) end
|
42
45
|
end
|
43
46
|
|
44
|
-
|
47
|
+
def progress_bar(int); print "." if (int % 100).zero? ; end
|
48
|
+
|
49
|
+
puts "Generating data..."
|
45
50
|
|
46
51
|
module ActiveRecord
|
47
52
|
class Faker
|
48
|
-
LOREM =
|
53
|
+
LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse non aliquet diam. Curabitur vel urna metus, quis malesuada elit.
|
49
54
|
Integer consequat tincidunt felis. Etiam non erat dolor. Vivamus imperdiet nibh sit amet diam eleifend id posuere diam malesuada. Mauris at accumsan sem.
|
50
55
|
Donec id lorem neque. Fusce erat lorem, ornare eu congue vitae, malesuada quis neque. Maecenas vel urna a velit pretium fermentum. Donec tortor enim,
|
51
56
|
tempor venenatis egestas a, tempor sed ipsum. Ut arcu justo, faucibus non imperdiet ac, interdum at diam. Pellentesque ipsum enim, venenatis ut iaculis vitae,
|
52
57
|
varius vitae sem. Sed rutrum quam ac elit euismod bibendum. Donec ultricies ultricies magna, at lacinia libero mollis aliquam. Sed ac arcu in tortor elementum
|
53
58
|
tincidunt vel interdum sem. Curabitur eget erat arcu. Praesent eget eros leo. Nam magna enim, sollicitudin vehicula scelerisque in, vulputate ut libero.
|
54
|
-
Praesent varius tincidunt commodo
|
59
|
+
Praesent varius tincidunt commodo".split
|
55
60
|
|
56
61
|
def self.name
|
57
|
-
LOREM.grep(/^\w*$/).sort_by { rand }.first(2).join
|
62
|
+
LOREM.grep(/^\w*$/).sort_by { rand }.first(2).join " "
|
58
63
|
end
|
59
64
|
|
60
65
|
def self.email
|
61
|
-
LOREM.grep(/^\w*$/).sort_by { rand }.first(2).join(
|
66
|
+
LOREM.grep(/^\w*$/).sort_by { rand }.first(2).join("@") + ".com"
|
62
67
|
end
|
63
68
|
end
|
64
69
|
end
|
@@ -69,109 +74,112 @@ end
|
|
69
74
|
|
70
75
|
# Using the same paragraph for all exhibits because it is very slow
|
71
76
|
# to generate unique paragraphs for all exhibits.
|
72
|
-
notes = ActiveRecord::Faker::LOREM.join
|
77
|
+
notes = ActiveRecord::Faker::LOREM.join " "
|
73
78
|
today = Date.today
|
74
79
|
|
75
|
-
puts
|
76
|
-
|
80
|
+
puts "Inserting #{RECORDS} users and exhibits..."
|
81
|
+
RECORDS.times do |record|
|
77
82
|
user = User.create(
|
78
|
-
:
|
79
|
-
:
|
80
|
-
:
|
83
|
+
created_at: today,
|
84
|
+
name: ActiveRecord::Faker.name,
|
85
|
+
email: ActiveRecord::Faker.email
|
81
86
|
)
|
82
87
|
|
83
88
|
Exhibit.create(
|
84
|
-
:
|
85
|
-
:
|
86
|
-
:
|
87
|
-
:
|
89
|
+
created_at: today,
|
90
|
+
name: ActiveRecord::Faker.name,
|
91
|
+
user: user,
|
92
|
+
notes: notes
|
88
93
|
)
|
94
|
+
progress_bar(record)
|
89
95
|
end
|
96
|
+
puts "Done!\n"
|
90
97
|
|
91
|
-
|
92
|
-
|
93
|
-
Benchmark.bm(46) do |x|
|
98
|
+
Benchmark.ips(TIME) do |x|
|
94
99
|
ar_obj = Exhibit.find(1)
|
95
|
-
attrs = { :
|
96
|
-
attrs_first = { :
|
97
|
-
attrs_second = { :
|
100
|
+
attrs = { name: "sam" }
|
101
|
+
attrs_first = { name: "sam" }
|
102
|
+
attrs_second = { name: "tom" }
|
98
103
|
exhibit = {
|
99
|
-
:
|
100
|
-
:
|
101
|
-
:
|
104
|
+
name: ActiveRecord::Faker.name,
|
105
|
+
notes: notes,
|
106
|
+
created_at: Date.today
|
102
107
|
}
|
103
108
|
|
104
|
-
x.report("Model#id
|
105
|
-
|
109
|
+
x.report("Model#id") do
|
110
|
+
ar_obj.id
|
111
|
+
end
|
112
|
+
|
113
|
+
x.report "Model.new (instantiation)" do
|
114
|
+
Exhibit.new
|
115
|
+
end
|
116
|
+
|
117
|
+
x.report "Model.new (setting attributes)" do
|
118
|
+
Exhibit.new(attrs)
|
106
119
|
end
|
107
120
|
|
108
|
-
x.report
|
109
|
-
|
121
|
+
x.report "Model.first" do
|
122
|
+
Exhibit.first.look
|
110
123
|
end
|
111
124
|
|
112
|
-
x.report
|
113
|
-
|
125
|
+
x.report "Model.take" do
|
126
|
+
Exhibit.take
|
114
127
|
end
|
115
128
|
|
116
|
-
x.report
|
117
|
-
|
129
|
+
x.report("Model.all limit(100)") do
|
130
|
+
Exhibit.look Exhibit.limit(100)
|
118
131
|
end
|
119
132
|
|
120
|
-
x.report
|
121
|
-
|
133
|
+
x.report("Model.all take(100)") do
|
134
|
+
Exhibit.look Exhibit.take(100)
|
122
135
|
end
|
123
136
|
|
124
|
-
x.report
|
125
|
-
|
137
|
+
x.report "Model.all limit(100) with relationship" do
|
138
|
+
Exhibit.feel Exhibit.limit(100).includes(:user)
|
126
139
|
end
|
127
140
|
|
128
|
-
x.report "Model.all limit(
|
129
|
-
|
141
|
+
x.report "Model.all limit(10,000)" do
|
142
|
+
Exhibit.look Exhibit.limit(10000)
|
130
143
|
end
|
131
144
|
|
132
|
-
x.report "Model.
|
133
|
-
|
145
|
+
x.report "Model.named_scope" do
|
146
|
+
Exhibit.limit(10).with_name.with_notes
|
134
147
|
end
|
135
148
|
|
136
|
-
x.report
|
137
|
-
|
149
|
+
x.report "Model.create" do
|
150
|
+
Exhibit.create(exhibit)
|
138
151
|
end
|
139
152
|
|
140
|
-
x.report
|
141
|
-
|
142
|
-
|
143
|
-
exhibit.attributes = attrs_second
|
144
|
-
}
|
153
|
+
x.report "Resource#attributes=" do
|
154
|
+
e = Exhibit.new(attrs_first)
|
155
|
+
e.attributes = attrs_second
|
145
156
|
end
|
146
157
|
|
147
|
-
x.report
|
148
|
-
|
158
|
+
x.report "Resource#update" do
|
159
|
+
Exhibit.first.update(name: "bob")
|
149
160
|
end
|
150
161
|
|
151
|
-
x.report
|
152
|
-
|
162
|
+
x.report "Resource#destroy" do
|
163
|
+
Exhibit.first.destroy
|
153
164
|
end
|
154
165
|
|
155
|
-
x.report
|
156
|
-
|
166
|
+
x.report "Model.transaction" do
|
167
|
+
Exhibit.transaction { Exhibit.new }
|
157
168
|
end
|
158
169
|
|
159
|
-
x.report
|
160
|
-
|
161
|
-
TIMES.times { Exhibit.find(id) }
|
170
|
+
x.report "Model.find(id)" do
|
171
|
+
User.find(1)
|
162
172
|
end
|
163
173
|
|
164
|
-
x.report
|
165
|
-
|
166
|
-
Exhibit.find_by_sql("SELECT * FROM exhibits WHERE id = #{(rand * 1000 + 1).to_i}").first
|
167
|
-
}
|
174
|
+
x.report "Model.find_by_sql" do
|
175
|
+
Exhibit.find_by_sql("SELECT * FROM exhibits WHERE id = #{(rand * 1000 + 1).to_i}").first
|
168
176
|
end
|
169
177
|
|
170
|
-
x.report "Model.log
|
171
|
-
|
178
|
+
x.report "Model.log" do
|
179
|
+
Exhibit.connection.send(:log, "hello", "world") { }
|
172
180
|
end
|
173
181
|
|
174
|
-
x.report "AR.execute(query)
|
175
|
-
|
182
|
+
x.report "AR.execute(query)" do
|
183
|
+
ActiveRecord::Base.connection.execute("SELECT * FROM exhibits WHERE id = #{(rand * 1000 + 1).to_i}")
|
176
184
|
end
|
177
185
|
end
|
data/examples/simple.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_record"
|
3
4
|
|
4
5
|
class Person < ActiveRecord::Base
|
5
|
-
establish_connection :
|
6
|
-
connection.create_table table_name, :
|
6
|
+
establish_connection adapter: "sqlite3", database: "foobar.db"
|
7
|
+
connection.create_table table_name, force: true do |t|
|
7
8
|
t.string :name
|
8
9
|
end
|
9
10
|
end
|
10
11
|
|
11
|
-
bob = Person.create!(:
|
12
|
+
bob = Person.create!(name: "bob")
|
12
13
|
puts Person.all.inspect
|
13
14
|
bob.destroy
|
14
15
|
puts Person.all.inspect
|