activerecord 2.3.18 → 3.2.22
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 +7 -0
- data/CHANGELOG.md +1014 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +222 -0
- data/examples/performance.rb +100 -126
- data/examples/simple.rb +14 -0
- data/lib/active_record/aggregations.rb +93 -99
- data/lib/active_record/associations/alias_tracker.rb +76 -0
- data/lib/active_record/associations/association.rb +247 -0
- data/lib/active_record/associations/association_scope.rb +134 -0
- data/lib/active_record/associations/belongs_to_association.rb +54 -61
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +17 -59
- data/lib/active_record/associations/builder/association.rb +55 -0
- data/lib/active_record/associations/builder/belongs_to.rb +88 -0
- data/lib/active_record/associations/builder/collection_association.rb +75 -0
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +57 -0
- data/lib/active_record/associations/builder/has_many.rb +71 -0
- data/lib/active_record/associations/builder/has_one.rb +62 -0
- data/lib/active_record/associations/builder/singular_association.rb +32 -0
- data/lib/active_record/associations/collection_association.rb +580 -0
- data/lib/active_record/associations/collection_proxy.rb +133 -0
- data/lib/active_record/associations/has_and_belongs_to_many_association.rb +39 -119
- data/lib/active_record/associations/has_many_association.rb +60 -79
- data/lib/active_record/associations/has_many_through_association.rb +127 -206
- data/lib/active_record/associations/has_one_association.rb +55 -114
- data/lib/active_record/associations/has_one_through_association.rb +25 -26
- data/lib/active_record/associations/join_dependency/join_association.rb +159 -0
- data/lib/active_record/associations/join_dependency/join_base.rb +24 -0
- data/lib/active_record/associations/join_dependency/join_part.rb +78 -0
- data/lib/active_record/associations/join_dependency.rb +214 -0
- data/lib/active_record/associations/join_helper.rb +55 -0
- data/lib/active_record/associations/preloader/association.rb +125 -0
- data/lib/active_record/associations/preloader/belongs_to.rb +17 -0
- data/lib/active_record/associations/preloader/collection_association.rb +24 -0
- data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +60 -0
- data/lib/active_record/associations/preloader/has_many.rb +17 -0
- data/lib/active_record/associations/preloader/has_many_through.rb +15 -0
- data/lib/active_record/associations/preloader/has_one.rb +23 -0
- data/lib/active_record/associations/preloader/has_one_through.rb +9 -0
- data/lib/active_record/associations/preloader/singular_association.rb +21 -0
- data/lib/active_record/associations/preloader/through_association.rb +67 -0
- data/lib/active_record/associations/preloader.rb +181 -0
- data/lib/active_record/associations/singular_association.rb +64 -0
- data/lib/active_record/associations/through_association.rb +87 -0
- data/lib/active_record/associations.rb +693 -1337
- data/lib/active_record/attribute_assignment.rb +221 -0
- data/lib/active_record/attribute_methods/before_type_cast.rb +31 -0
- data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +32 -0
- data/lib/active_record/attribute_methods/dirty.rb +111 -0
- data/lib/active_record/attribute_methods/primary_key.rb +114 -0
- data/lib/active_record/attribute_methods/query.rb +39 -0
- data/lib/active_record/attribute_methods/read.rb +136 -0
- data/lib/active_record/attribute_methods/serialization.rb +120 -0
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +65 -0
- data/lib/active_record/attribute_methods/write.rb +70 -0
- data/lib/active_record/attribute_methods.rb +211 -339
- data/lib/active_record/autosave_association.rb +179 -149
- data/lib/active_record/base.rb +401 -2907
- data/lib/active_record/callbacks.rb +91 -176
- data/lib/active_record/coders/yaml_column.rb +41 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +236 -119
- data/lib/active_record/connection_adapters/abstract/connection_specification.rb +110 -58
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +12 -11
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +175 -74
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +31 -35
- data/lib/active_record/connection_adapters/abstract/quoting.rb +71 -21
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +81 -311
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +194 -78
- data/lib/active_record/connection_adapters/abstract_adapter.rb +130 -83
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +676 -0
- data/lib/active_record/connection_adapters/column.rb +296 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +280 -0
- data/lib/active_record/connection_adapters/mysql_adapter.rb +272 -493
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +650 -405
- data/lib/active_record/connection_adapters/schema_cache.rb +69 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +30 -9
- data/lib/active_record/connection_adapters/sqlite_adapter.rb +276 -147
- data/lib/active_record/connection_adapters/statement_pool.rb +40 -0
- data/lib/active_record/counter_cache.rb +123 -0
- data/lib/active_record/dynamic_finder_match.rb +41 -14
- data/lib/active_record/dynamic_matchers.rb +84 -0
- data/lib/active_record/dynamic_scope_match.rb +13 -15
- data/lib/active_record/errors.rb +195 -0
- data/lib/active_record/explain.rb +86 -0
- data/lib/active_record/explain_subscriber.rb +25 -0
- data/lib/active_record/fixtures/file.rb +65 -0
- data/lib/active_record/fixtures.rb +695 -770
- data/lib/active_record/identity_map.rb +162 -0
- data/lib/active_record/inheritance.rb +174 -0
- data/lib/active_record/integration.rb +60 -0
- data/lib/active_record/locale/en.yml +9 -27
- data/lib/active_record/locking/optimistic.rb +76 -73
- data/lib/active_record/locking/pessimistic.rb +32 -10
- data/lib/active_record/log_subscriber.rb +72 -0
- data/lib/active_record/migration/command_recorder.rb +105 -0
- data/lib/active_record/migration.rb +415 -205
- data/lib/active_record/model_schema.rb +368 -0
- data/lib/active_record/nested_attributes.rb +153 -63
- data/lib/active_record/observer.rb +27 -103
- data/lib/active_record/persistence.rb +376 -0
- data/lib/active_record/query_cache.rb +49 -8
- data/lib/active_record/querying.rb +58 -0
- data/lib/active_record/railtie.rb +131 -0
- data/lib/active_record/railties/console_sandbox.rb +6 -0
- data/lib/active_record/railties/controller_runtime.rb +49 -0
- data/lib/active_record/railties/databases.rake +659 -0
- data/lib/active_record/railties/jdbcmysql_error.rb +16 -0
- data/lib/active_record/readonly_attributes.rb +26 -0
- data/lib/active_record/reflection.rb +269 -120
- data/lib/active_record/relation/batches.rb +90 -0
- data/lib/active_record/relation/calculations.rb +372 -0
- data/lib/active_record/relation/delegation.rb +49 -0
- data/lib/active_record/relation/finder_methods.rb +402 -0
- data/lib/active_record/relation/predicate_builder.rb +63 -0
- data/lib/active_record/relation/query_methods.rb +417 -0
- data/lib/active_record/relation/spawn_methods.rb +180 -0
- data/lib/active_record/relation.rb +537 -0
- data/lib/active_record/result.rb +40 -0
- data/lib/active_record/sanitization.rb +194 -0
- data/lib/active_record/schema.rb +9 -6
- data/lib/active_record/schema_dumper.rb +55 -32
- data/lib/active_record/scoping/default.rb +142 -0
- data/lib/active_record/scoping/named.rb +200 -0
- data/lib/active_record/scoping.rb +152 -0
- data/lib/active_record/serialization.rb +8 -91
- data/lib/active_record/serializers/xml_serializer.rb +43 -197
- data/lib/active_record/session_store.rb +129 -103
- data/lib/active_record/store.rb +52 -0
- data/lib/active_record/test_case.rb +30 -23
- data/lib/active_record/timestamp.rb +95 -52
- data/lib/active_record/transactions.rb +212 -66
- data/lib/active_record/translation.rb +22 -0
- data/lib/active_record/validations/associated.rb +43 -0
- data/lib/active_record/validations/uniqueness.rb +180 -0
- data/lib/active_record/validations.rb +43 -1106
- data/lib/active_record/version.rb +5 -4
- data/lib/active_record.rb +121 -48
- data/lib/rails/generators/active_record/migration/migration_generator.rb +25 -0
- data/lib/rails/generators/active_record/migration/templates/migration.rb +34 -0
- data/lib/rails/generators/active_record/migration.rb +15 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +47 -0
- data/lib/rails/generators/active_record/model/templates/migration.rb +15 -0
- data/lib/rails/generators/active_record/model/templates/model.rb +12 -0
- data/lib/rails/generators/active_record/model/templates/module.rb +7 -0
- data/lib/rails/generators/active_record/observer/observer_generator.rb +15 -0
- data/lib/rails/generators/active_record/observer/templates/observer.rb +4 -0
- data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +25 -0
- data/lib/rails/generators/active_record/session_migration/templates/migration.rb +12 -0
- data/lib/rails/generators/active_record.rb +25 -0
- metadata +187 -363
- data/CHANGELOG +0 -5904
- data/README +0 -351
- data/RUNNING_UNIT_TESTS +0 -36
- data/Rakefile +0 -268
- data/install.rb +0 -30
- data/lib/active_record/association_preload.rb +0 -406
- data/lib/active_record/associations/association_collection.rb +0 -533
- data/lib/active_record/associations/association_proxy.rb +0 -288
- data/lib/active_record/batches.rb +0 -85
- data/lib/active_record/calculations.rb +0 -321
- data/lib/active_record/dirty.rb +0 -183
- data/lib/active_record/named_scope.rb +0 -197
- data/lib/active_record/serializers/json_serializer.rb +0 -91
- data/lib/activerecord.rb +0 -2
- data/test/assets/example.log +0 -1
- data/test/assets/flowers.jpg +0 -0
- data/test/cases/aaa_create_tables_test.rb +0 -24
- data/test/cases/active_schema_test_mysql.rb +0 -122
- data/test/cases/active_schema_test_postgresql.rb +0 -24
- data/test/cases/adapter_test.rb +0 -144
- data/test/cases/aggregations_test.rb +0 -167
- data/test/cases/ar_schema_test.rb +0 -32
- data/test/cases/associations/belongs_to_associations_test.rb +0 -438
- data/test/cases/associations/callbacks_test.rb +0 -161
- data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
- data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
- data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
- data/test/cases/associations/eager_singularization_test.rb +0 -145
- data/test/cases/associations/eager_test.rb +0 -852
- data/test/cases/associations/extension_test.rb +0 -62
- data/test/cases/associations/habtm_join_table_test.rb +0 -56
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
- data/test/cases/associations/has_many_associations_test.rb +0 -1273
- data/test/cases/associations/has_many_through_associations_test.rb +0 -360
- data/test/cases/associations/has_one_associations_test.rb +0 -330
- data/test/cases/associations/has_one_through_associations_test.rb +0 -209
- data/test/cases/associations/inner_join_association_test.rb +0 -93
- data/test/cases/associations/inverse_associations_test.rb +0 -566
- data/test/cases/associations/join_model_test.rb +0 -712
- data/test/cases/associations_test.rb +0 -282
- data/test/cases/attribute_methods_test.rb +0 -305
- data/test/cases/autosave_association_test.rb +0 -1218
- data/test/cases/base_test.rb +0 -2166
- data/test/cases/batches_test.rb +0 -81
- data/test/cases/binary_test.rb +0 -30
- data/test/cases/calculations_test.rb +0 -360
- data/test/cases/callbacks_observers_test.rb +0 -38
- data/test/cases/callbacks_test.rb +0 -438
- data/test/cases/class_inheritable_attributes_test.rb +0 -32
- data/test/cases/column_alias_test.rb +0 -17
- data/test/cases/column_definition_test.rb +0 -70
- data/test/cases/connection_pool_test.rb +0 -25
- data/test/cases/connection_test_firebird.rb +0 -8
- data/test/cases/connection_test_mysql.rb +0 -65
- data/test/cases/copy_table_test_sqlite.rb +0 -80
- data/test/cases/counter_cache_test.rb +0 -84
- data/test/cases/database_statements_test.rb +0 -12
- data/test/cases/datatype_test_postgresql.rb +0 -204
- data/test/cases/date_time_test.rb +0 -37
- data/test/cases/default_test_firebird.rb +0 -16
- data/test/cases/defaults_test.rb +0 -111
- data/test/cases/deprecated_finder_test.rb +0 -30
- data/test/cases/dirty_test.rb +0 -316
- data/test/cases/finder_respond_to_test.rb +0 -76
- data/test/cases/finder_test.rb +0 -1098
- data/test/cases/fixtures_test.rb +0 -661
- data/test/cases/helper.rb +0 -68
- data/test/cases/i18n_test.rb +0 -46
- data/test/cases/inheritance_test.rb +0 -262
- data/test/cases/invalid_date_test.rb +0 -24
- data/test/cases/json_serialization_test.rb +0 -219
- data/test/cases/lifecycle_test.rb +0 -193
- data/test/cases/locking_test.rb +0 -350
- data/test/cases/method_scoping_test.rb +0 -704
- data/test/cases/migration_test.rb +0 -1649
- data/test/cases/migration_test_firebird.rb +0 -124
- data/test/cases/mixin_test.rb +0 -96
- data/test/cases/modules_test.rb +0 -109
- data/test/cases/multiple_db_test.rb +0 -85
- data/test/cases/named_scope_test.rb +0 -372
- data/test/cases/nested_attributes_test.rb +0 -840
- data/test/cases/pk_test.rb +0 -119
- data/test/cases/pooled_connections_test.rb +0 -103
- data/test/cases/query_cache_test.rb +0 -129
- data/test/cases/readonly_test.rb +0 -107
- data/test/cases/reflection_test.rb +0 -234
- data/test/cases/reload_models_test.rb +0 -22
- data/test/cases/repair_helper.rb +0 -50
- data/test/cases/reserved_word_test_mysql.rb +0 -176
- data/test/cases/sanitize_test.rb +0 -25
- data/test/cases/schema_authorization_test_postgresql.rb +0 -75
- data/test/cases/schema_dumper_test.rb +0 -211
- data/test/cases/schema_test_postgresql.rb +0 -178
- data/test/cases/serialization_test.rb +0 -47
- data/test/cases/sp_test_mysql.rb +0 -16
- data/test/cases/synonym_test_oracle.rb +0 -17
- data/test/cases/timestamp_test.rb +0 -75
- data/test/cases/transactions_test.rb +0 -543
- data/test/cases/unconnected_test.rb +0 -32
- data/test/cases/validations_i18n_test.rb +0 -925
- data/test/cases/validations_test.rb +0 -1684
- data/test/cases/xml_serialization_test.rb +0 -240
- data/test/cases/yaml_serialization_test.rb +0 -11
- data/test/config.rb +0 -5
- data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
- data/test/connections/jdbc_jdbch2/connection.rb +0 -18
- data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
- data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
- data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
- data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
- data/test/connections/native_db2/connection.rb +0 -25
- data/test/connections/native_firebird/connection.rb +0 -26
- data/test/connections/native_frontbase/connection.rb +0 -27
- data/test/connections/native_mysql/connection.rb +0 -25
- data/test/connections/native_openbase/connection.rb +0 -21
- data/test/connections/native_oracle/connection.rb +0 -27
- data/test/connections/native_postgresql/connection.rb +0 -21
- data/test/connections/native_sqlite/connection.rb +0 -25
- data/test/connections/native_sqlite3/connection.rb +0 -25
- data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
- data/test/connections/native_sybase/connection.rb +0 -23
- data/test/fixtures/accounts.yml +0 -29
- data/test/fixtures/all/developers.yml +0 -0
- data/test/fixtures/all/people.csv +0 -0
- data/test/fixtures/all/tasks.yml +0 -0
- data/test/fixtures/author_addresses.yml +0 -5
- data/test/fixtures/author_favorites.yml +0 -4
- data/test/fixtures/authors.yml +0 -9
- data/test/fixtures/binaries.yml +0 -132
- data/test/fixtures/books.yml +0 -7
- data/test/fixtures/categories/special_categories.yml +0 -9
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
- data/test/fixtures/categories.yml +0 -14
- data/test/fixtures/categories_ordered.yml +0 -7
- data/test/fixtures/categories_posts.yml +0 -23
- data/test/fixtures/categorizations.yml +0 -17
- data/test/fixtures/clubs.yml +0 -6
- data/test/fixtures/comments.yml +0 -59
- data/test/fixtures/companies.yml +0 -56
- data/test/fixtures/computers.yml +0 -4
- data/test/fixtures/courses.yml +0 -7
- data/test/fixtures/customers.yml +0 -26
- data/test/fixtures/developers.yml +0 -21
- data/test/fixtures/developers_projects.yml +0 -17
- data/test/fixtures/edges.yml +0 -6
- data/test/fixtures/entrants.yml +0 -14
- data/test/fixtures/faces.yml +0 -11
- data/test/fixtures/fk_test_has_fk.yml +0 -3
- data/test/fixtures/fk_test_has_pk.yml +0 -2
- data/test/fixtures/funny_jokes.yml +0 -10
- data/test/fixtures/interests.yml +0 -33
- data/test/fixtures/items.yml +0 -4
- data/test/fixtures/jobs.yml +0 -7
- data/test/fixtures/legacy_things.yml +0 -3
- data/test/fixtures/mateys.yml +0 -4
- data/test/fixtures/member_types.yml +0 -6
- data/test/fixtures/members.yml +0 -6
- data/test/fixtures/memberships.yml +0 -20
- data/test/fixtures/men.yml +0 -5
- data/test/fixtures/minimalistics.yml +0 -2
- data/test/fixtures/mixed_case_monkeys.yml +0 -6
- data/test/fixtures/mixins.yml +0 -29
- data/test/fixtures/movies.yml +0 -7
- data/test/fixtures/naked/csv/accounts.csv +0 -1
- data/test/fixtures/naked/yml/accounts.yml +0 -1
- data/test/fixtures/naked/yml/companies.yml +0 -1
- data/test/fixtures/naked/yml/courses.yml +0 -1
- data/test/fixtures/organizations.yml +0 -5
- data/test/fixtures/owners.yml +0 -7
- data/test/fixtures/parrots.yml +0 -27
- data/test/fixtures/parrots_pirates.yml +0 -7
- data/test/fixtures/people.yml +0 -15
- data/test/fixtures/pets.yml +0 -14
- data/test/fixtures/pirates.yml +0 -9
- data/test/fixtures/polymorphic_designs.yml +0 -19
- data/test/fixtures/polymorphic_prices.yml +0 -19
- data/test/fixtures/posts.yml +0 -52
- data/test/fixtures/price_estimates.yml +0 -7
- data/test/fixtures/projects.yml +0 -7
- data/test/fixtures/readers.yml +0 -9
- data/test/fixtures/references.yml +0 -17
- data/test/fixtures/reserved_words/distinct.yml +0 -5
- data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
- data/test/fixtures/reserved_words/group.yml +0 -14
- data/test/fixtures/reserved_words/select.yml +0 -8
- data/test/fixtures/reserved_words/values.yml +0 -7
- data/test/fixtures/ships.yml +0 -5
- data/test/fixtures/sponsors.yml +0 -9
- data/test/fixtures/subscribers.yml +0 -7
- data/test/fixtures/subscriptions.yml +0 -12
- data/test/fixtures/taggings.yml +0 -28
- data/test/fixtures/tags.yml +0 -7
- data/test/fixtures/tasks.yml +0 -7
- data/test/fixtures/tees.yml +0 -4
- data/test/fixtures/ties.yml +0 -4
- data/test/fixtures/topics.yml +0 -42
- data/test/fixtures/toys.yml +0 -4
- data/test/fixtures/treasures.yml +0 -10
- data/test/fixtures/vertices.yml +0 -4
- data/test/fixtures/warehouse-things.yml +0 -3
- data/test/fixtures/zines.yml +0 -5
- data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
- data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
- data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
- data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
- data/test/migrations/duplicate/3_foo.rb +0 -7
- data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
- data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
- data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
- data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
- data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
- data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
- data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
- data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
- data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
- data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
- data/test/migrations/missing/1_people_have_last_names.rb +0 -9
- data/test/migrations/missing/3_we_need_reminders.rb +0 -12
- data/test/migrations/missing/4_innocent_jointable.rb +0 -12
- data/test/migrations/valid/1_people_have_last_names.rb +0 -9
- data/test/migrations/valid/2_we_need_reminders.rb +0 -12
- data/test/migrations/valid/3_innocent_jointable.rb +0 -12
- data/test/models/author.rb +0 -151
- data/test/models/auto_id.rb +0 -4
- data/test/models/binary.rb +0 -2
- data/test/models/bird.rb +0 -9
- data/test/models/book.rb +0 -4
- data/test/models/categorization.rb +0 -5
- data/test/models/category.rb +0 -34
- data/test/models/citation.rb +0 -6
- data/test/models/club.rb +0 -13
- data/test/models/column_name.rb +0 -3
- data/test/models/comment.rb +0 -29
- data/test/models/company.rb +0 -173
- data/test/models/company_in_module.rb +0 -78
- data/test/models/computer.rb +0 -3
- data/test/models/contact.rb +0 -16
- data/test/models/contract.rb +0 -5
- data/test/models/course.rb +0 -3
- data/test/models/customer.rb +0 -73
- data/test/models/default.rb +0 -2
- data/test/models/developer.rb +0 -101
- data/test/models/edge.rb +0 -5
- data/test/models/entrant.rb +0 -3
- data/test/models/essay.rb +0 -3
- data/test/models/event.rb +0 -3
- data/test/models/event_author.rb +0 -8
- data/test/models/face.rb +0 -7
- data/test/models/guid.rb +0 -2
- data/test/models/interest.rb +0 -5
- data/test/models/invoice.rb +0 -4
- data/test/models/item.rb +0 -7
- data/test/models/job.rb +0 -5
- data/test/models/joke.rb +0 -3
- data/test/models/keyboard.rb +0 -3
- data/test/models/legacy_thing.rb +0 -3
- data/test/models/line_item.rb +0 -3
- data/test/models/man.rb +0 -9
- data/test/models/matey.rb +0 -4
- data/test/models/member.rb +0 -12
- data/test/models/member_detail.rb +0 -5
- data/test/models/member_type.rb +0 -3
- data/test/models/membership.rb +0 -9
- data/test/models/minimalistic.rb +0 -2
- data/test/models/mixed_case_monkey.rb +0 -3
- data/test/models/movie.rb +0 -5
- data/test/models/order.rb +0 -4
- data/test/models/organization.rb +0 -6
- data/test/models/owner.rb +0 -5
- data/test/models/parrot.rb +0 -22
- data/test/models/person.rb +0 -16
- data/test/models/pet.rb +0 -5
- data/test/models/pirate.rb +0 -80
- data/test/models/polymorphic_design.rb +0 -3
- data/test/models/polymorphic_price.rb +0 -3
- data/test/models/post.rb +0 -102
- data/test/models/price_estimate.rb +0 -3
- data/test/models/project.rb +0 -30
- data/test/models/reader.rb +0 -4
- data/test/models/reference.rb +0 -4
- data/test/models/reply.rb +0 -46
- data/test/models/ship.rb +0 -19
- data/test/models/ship_part.rb +0 -7
- data/test/models/sponsor.rb +0 -4
- data/test/models/subject.rb +0 -4
- data/test/models/subscriber.rb +0 -8
- data/test/models/subscription.rb +0 -4
- data/test/models/tag.rb +0 -7
- data/test/models/tagging.rb +0 -10
- data/test/models/task.rb +0 -3
- data/test/models/tee.rb +0 -4
- data/test/models/tie.rb +0 -4
- data/test/models/topic.rb +0 -80
- data/test/models/toy.rb +0 -6
- data/test/models/treasure.rb +0 -8
- data/test/models/vertex.rb +0 -9
- data/test/models/warehouse_thing.rb +0 -5
- data/test/models/zine.rb +0 -3
- data/test/schema/mysql_specific_schema.rb +0 -31
- data/test/schema/postgresql_specific_schema.rb +0 -114
- data/test/schema/schema.rb +0 -550
- data/test/schema/schema2.rb +0 -6
- data/test/schema/sqlite_specific_schema.rb +0 -25
@@ -0,0 +1,52 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
# Store gives you a thin wrapper around serialize for the purpose of storing hashes in a single column.
|
3
|
+
# It's like a simple key/value store backed into your record when you don't care about being able to
|
4
|
+
# query that store outside the context of a single record.
|
5
|
+
#
|
6
|
+
# You can then declare accessors to this store that are then accessible just like any other attribute
|
7
|
+
# of the model. This is very helpful for easily exposing store keys to a form or elsewhere that's
|
8
|
+
# already built around just accessing attributes on the model.
|
9
|
+
#
|
10
|
+
# Make sure that you declare the database column used for the serialized store as a text, so there's
|
11
|
+
# plenty of room.
|
12
|
+
#
|
13
|
+
# Examples:
|
14
|
+
#
|
15
|
+
# class User < ActiveRecord::Base
|
16
|
+
# store :settings, accessors: [ :color, :homepage ]
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# u = User.new(color: 'black', homepage: '37signals.com')
|
20
|
+
# u.color # Accessor stored attribute
|
21
|
+
# u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor
|
22
|
+
#
|
23
|
+
# # Add additional accessors to an existing store through store_accessor
|
24
|
+
# class SuperUser < User
|
25
|
+
# store_accessor :settings, :privileges, :servants
|
26
|
+
# end
|
27
|
+
module Store
|
28
|
+
extend ActiveSupport::Concern
|
29
|
+
|
30
|
+
module ClassMethods
|
31
|
+
def store(store_attribute, options = {})
|
32
|
+
serialize store_attribute, Hash
|
33
|
+
store_accessor(store_attribute, options[:accessors]) if options.has_key? :accessors
|
34
|
+
end
|
35
|
+
|
36
|
+
def store_accessor(store_attribute, *keys)
|
37
|
+
Array(keys).flatten.each do |key|
|
38
|
+
define_method("#{key}=") do |value|
|
39
|
+
send("#{store_attribute}=", {}) unless send(store_attribute).is_a?(Hash)
|
40
|
+
send("#{store_attribute}_will_change!")
|
41
|
+
send(store_attribute)[key] = value
|
42
|
+
end
|
43
|
+
|
44
|
+
define_method(key) do
|
45
|
+
send("#{store_attribute}=", {}) unless send(store_attribute).is_a?(Hash)
|
46
|
+
send(store_attribute)[key]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -1,7 +1,25 @@
|
|
1
|
-
require "active_support/test_case"
|
2
|
-
|
3
1
|
module ActiveRecord
|
2
|
+
# = Active Record Test Case
|
3
|
+
#
|
4
|
+
# Defines some test assertions to test against SQL queries.
|
4
5
|
class TestCase < ActiveSupport::TestCase #:nodoc:
|
6
|
+
setup :cleanup_identity_map
|
7
|
+
|
8
|
+
def setup
|
9
|
+
cleanup_identity_map
|
10
|
+
end
|
11
|
+
|
12
|
+
def cleanup_identity_map
|
13
|
+
ActiveRecord::IdentityMap.clear
|
14
|
+
end
|
15
|
+
|
16
|
+
# Backport skip to Ruby 1.8. test/unit doesn't support it, so just
|
17
|
+
# make it a noop.
|
18
|
+
unless instance_methods.map(&:to_s).include?("skip")
|
19
|
+
def skip(message)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
5
23
|
def assert_date_from_db(expected, actual, message = nil)
|
6
24
|
# SybaseAdapter doesn't have a separate column type just for dates,
|
7
25
|
# so the time is in the string and incorrectly formatted
|
@@ -13,41 +31,30 @@ module ActiveRecord
|
|
13
31
|
end
|
14
32
|
|
15
33
|
def assert_sql(*patterns_to_match)
|
16
|
-
|
34
|
+
ActiveRecord::SQLCounter.log = []
|
17
35
|
yield
|
36
|
+
ActiveRecord::SQLCounter.log
|
18
37
|
ensure
|
19
38
|
failed_patterns = []
|
20
39
|
patterns_to_match.each do |pattern|
|
21
|
-
failed_patterns << pattern unless
|
40
|
+
failed_patterns << pattern unless ActiveRecord::SQLCounter.log.any?{ |sql| pattern === sql }
|
22
41
|
end
|
23
|
-
assert failed_patterns.empty?, "Query pattern(s) #{failed_patterns.map
|
42
|
+
assert failed_patterns.empty?, "Query pattern(s) #{failed_patterns.map{ |p| p.inspect }.join(', ')} not found.#{ActiveRecord::SQLCounter.log.size == 0 ? '' : "\nQueries:\n#{ActiveRecord::SQLCounter.log.join("\n")}"}"
|
24
43
|
end
|
25
44
|
|
26
45
|
def assert_queries(num = 1)
|
27
|
-
|
46
|
+
ActiveRecord::SQLCounter.log = []
|
28
47
|
yield
|
29
48
|
ensure
|
30
|
-
|
31
|
-
assert_equal num, $queries_executed.size, "#{$queries_executed.size} instead of #{num} queries were executed.#{$queries_executed.size == 0 ? '' : "\nQueries:\n#{$queries_executed.join("\n")}"}"
|
49
|
+
assert_equal num, ActiveRecord::SQLCounter.log.size, "#{ActiveRecord::SQLCounter.log.size} instead of #{num} queries were executed.#{ActiveRecord::SQLCounter.log.size == 0 ? '' : "\nQueries:\n#{ActiveRecord::SQLCounter.log.join("\n")}"}"
|
32
50
|
end
|
33
51
|
|
34
52
|
def assert_no_queries(&block)
|
53
|
+
prev_ignored_sql = ActiveRecord::SQLCounter.ignored_sql
|
54
|
+
ActiveRecord::SQLCounter.ignored_sql = []
|
35
55
|
assert_queries(0, &block)
|
36
|
-
|
37
|
-
|
38
|
-
def self.use_concurrent_connections
|
39
|
-
setup :connection_allow_concurrency_setup
|
40
|
-
teardown :connection_allow_concurrency_teardown
|
41
|
-
end
|
42
|
-
|
43
|
-
def connection_allow_concurrency_setup
|
44
|
-
@connection = ActiveRecord::Base.remove_connection
|
45
|
-
ActiveRecord::Base.establish_connection(@connection.merge({:allow_concurrency => true}))
|
46
|
-
end
|
47
|
-
|
48
|
-
def connection_allow_concurrency_teardown
|
49
|
-
ActiveRecord::Base.clear_all_connections!
|
50
|
-
ActiveRecord::Base.establish_connection(@connection)
|
56
|
+
ensure
|
57
|
+
ActiveRecord::SQLCounter.ignored_sql = prev_ignored_sql
|
51
58
|
end
|
52
59
|
|
53
60
|
def with_kcode(kcode)
|
@@ -1,71 +1,114 @@
|
|
1
|
+
require 'active_support/core_ext/class/attribute'
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
|
-
# Active Record
|
3
|
-
#
|
4
|
+
# = Active Record Timestamp
|
5
|
+
#
|
6
|
+
# Active Record automatically timestamps create and update operations if the
|
7
|
+
# table has fields named <tt>created_at/created_on</tt> or
|
8
|
+
# <tt>updated_at/updated_on</tt>.
|
9
|
+
#
|
10
|
+
# Timestamping can be turned off by setting:
|
11
|
+
#
|
12
|
+
# config.active_record.record_timestamps = false
|
13
|
+
#
|
14
|
+
# Timestamps are in the local timezone by default but you can use UTC by setting:
|
15
|
+
#
|
16
|
+
# config.active_record.default_timezone = :utc
|
17
|
+
#
|
18
|
+
# == Time Zone aware attributes
|
19
|
+
#
|
20
|
+
# By default, ActiveRecord::Base keeps all the datetime columns time zone aware by executing following code.
|
21
|
+
#
|
22
|
+
# config.active_record.time_zone_aware_attributes = true
|
4
23
|
#
|
5
|
-
#
|
6
|
-
# <tt>ActiveRecord::Base.record_timestamps = false</tt>
|
24
|
+
# This feature can easily be turned off by assigning value <tt>false</tt> .
|
7
25
|
#
|
8
|
-
#
|
9
|
-
#
|
26
|
+
# If your attributes are time zone aware and you desire to skip time zone conversion to the current Time.zone
|
27
|
+
# when reading certain attributes then you can do following:
|
28
|
+
#
|
29
|
+
# class Topic < ActiveRecord::Base
|
30
|
+
# self.skip_time_zone_conversion_for_attributes = [:written_on]
|
31
|
+
# end
|
10
32
|
module Timestamp
|
11
|
-
|
12
|
-
base.alias_method_chain :create, :timestamps
|
13
|
-
base.alias_method_chain :update, :timestamps
|
33
|
+
extend ActiveSupport::Concern
|
14
34
|
|
15
|
-
|
16
|
-
|
35
|
+
included do
|
36
|
+
class_attribute :record_timestamps
|
37
|
+
self.record_timestamps = true
|
17
38
|
end
|
18
|
-
|
19
|
-
# Saves the record with the updated_at/on attributes set to the current time.
|
20
|
-
# If the save fails because of validation errors, an ActiveRecord::RecordInvalid exception is raised.
|
21
|
-
# If an attribute name is passed, that attribute is used for the touch instead of the updated_at/on attributes.
|
22
|
-
#
|
23
|
-
# Examples:
|
24
|
-
#
|
25
|
-
# product.touch # updates updated_at
|
26
|
-
# product.touch(:designed_at) # updates the designed_at attribute
|
27
|
-
def touch(attribute = nil)
|
28
|
-
current_time = current_time_from_proper_timezone
|
29
|
-
|
30
|
-
if attribute
|
31
|
-
write_attribute(attribute, current_time)
|
32
|
-
else
|
33
|
-
write_attribute('updated_at', current_time) if respond_to?(:updated_at)
|
34
|
-
write_attribute('updated_on', current_time) if respond_to?(:updated_on)
|
35
|
-
end
|
36
39
|
|
37
|
-
|
40
|
+
def initialize_dup(other)
|
41
|
+
clear_timestamp_attributes
|
42
|
+
super
|
38
43
|
end
|
39
44
|
|
45
|
+
private
|
40
46
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
current_time = current_time_from_proper_timezone
|
45
|
-
|
46
|
-
write_attribute('created_at', current_time) if respond_to?(:created_at) && created_at.nil?
|
47
|
-
write_attribute('created_on', current_time) if respond_to?(:created_on) && created_on.nil?
|
47
|
+
def create #:nodoc:
|
48
|
+
if self.record_timestamps
|
49
|
+
current_time = current_time_from_proper_timezone
|
48
50
|
|
49
|
-
|
50
|
-
|
51
|
+
all_timestamp_attributes.each do |column|
|
52
|
+
if respond_to?(column) && respond_to?("#{column}=") && self.send(column).nil?
|
53
|
+
write_attribute(column.to_s, current_time)
|
54
|
+
end
|
51
55
|
end
|
52
|
-
|
53
|
-
create_without_timestamps
|
54
56
|
end
|
55
57
|
|
56
|
-
|
57
|
-
|
58
|
-
current_time = current_time_from_proper_timezone
|
58
|
+
super
|
59
|
+
end
|
59
60
|
|
60
|
-
|
61
|
-
|
62
|
-
|
61
|
+
def update(*args) #:nodoc:
|
62
|
+
if should_record_timestamps?
|
63
|
+
current_time = current_time_from_proper_timezone
|
63
64
|
|
64
|
-
|
65
|
+
timestamp_attributes_for_update_in_model.each do |column|
|
66
|
+
column = column.to_s
|
67
|
+
next if attribute_changed?(column)
|
68
|
+
write_attribute(column, current_time)
|
69
|
+
end
|
65
70
|
end
|
66
|
-
|
67
|
-
|
68
|
-
|
71
|
+
super
|
72
|
+
end
|
73
|
+
|
74
|
+
def should_record_timestamps?
|
75
|
+
self.record_timestamps && (!partial_updates? || changed? || (attributes.keys & self.class.serialized_attributes.keys).present?)
|
76
|
+
end
|
77
|
+
|
78
|
+
def timestamp_attributes_for_create_in_model
|
79
|
+
timestamp_attributes_for_create.select { |c| self.class.column_names.include?(c.to_s) }
|
80
|
+
end
|
81
|
+
|
82
|
+
def timestamp_attributes_for_update_in_model
|
83
|
+
timestamp_attributes_for_update.select { |c| self.class.column_names.include?(c.to_s) }
|
84
|
+
end
|
85
|
+
|
86
|
+
def all_timestamp_attributes_in_model
|
87
|
+
timestamp_attributes_for_create_in_model + timestamp_attributes_for_update_in_model
|
88
|
+
end
|
89
|
+
|
90
|
+
def timestamp_attributes_for_update #:nodoc:
|
91
|
+
[:updated_at, :updated_on]
|
92
|
+
end
|
93
|
+
|
94
|
+
def timestamp_attributes_for_create #:nodoc:
|
95
|
+
[:created_at, :created_on]
|
96
|
+
end
|
97
|
+
|
98
|
+
def all_timestamp_attributes #:nodoc:
|
99
|
+
timestamp_attributes_for_create + timestamp_attributes_for_update
|
100
|
+
end
|
101
|
+
|
102
|
+
def current_time_from_proper_timezone #:nodoc:
|
103
|
+
self.class.default_timezone == :utc ? Time.now.utc : Time.now
|
104
|
+
end
|
105
|
+
|
106
|
+
# Clear attributes and changed_attributes
|
107
|
+
def clear_timestamp_attributes
|
108
|
+
all_timestamp_attributes_in_model.each do |attribute_name|
|
109
|
+
self[attribute_name] = nil
|
110
|
+
changed_attributes.delete(attribute_name)
|
69
111
|
end
|
112
|
+
end
|
70
113
|
end
|
71
|
-
end
|
114
|
+
end
|