activerecord 2.3.18 → 3.2.22
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 +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
@@ -1,360 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/post'
|
3
|
-
require 'models/person'
|
4
|
-
require 'models/reference'
|
5
|
-
require 'models/job'
|
6
|
-
require 'models/reader'
|
7
|
-
require 'models/comment'
|
8
|
-
require 'models/tag'
|
9
|
-
require 'models/tagging'
|
10
|
-
require 'models/author'
|
11
|
-
require 'models/owner'
|
12
|
-
require 'models/pet'
|
13
|
-
require 'models/toy'
|
14
|
-
require 'models/contract'
|
15
|
-
require 'models/company'
|
16
|
-
require 'models/developer'
|
17
|
-
|
18
|
-
class HasManyThroughAssociationsTest < ActiveRecord::TestCase
|
19
|
-
fixtures :posts, :readers, :people, :comments, :authors, :owners, :pets, :toys,
|
20
|
-
:companies
|
21
|
-
|
22
|
-
def test_associate_existing
|
23
|
-
assert_queries(2) { posts(:thinking);people(:david) }
|
24
|
-
|
25
|
-
posts(:thinking).people
|
26
|
-
|
27
|
-
assert_queries(1) do
|
28
|
-
posts(:thinking).people << people(:david)
|
29
|
-
end
|
30
|
-
|
31
|
-
assert_queries(1) do
|
32
|
-
assert posts(:thinking).people.include?(people(:david))
|
33
|
-
end
|
34
|
-
|
35
|
-
assert posts(:thinking).reload.people(true).include?(people(:david))
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_associating_new
|
39
|
-
assert_queries(1) { posts(:thinking) }
|
40
|
-
new_person = nil # so block binding catches it
|
41
|
-
|
42
|
-
assert_queries(0) do
|
43
|
-
new_person = Person.new :first_name => 'bob'
|
44
|
-
end
|
45
|
-
|
46
|
-
# Associating new records always saves them
|
47
|
-
# Thus, 1 query for the new person record, 1 query for the new join table record
|
48
|
-
assert_queries(2) do
|
49
|
-
posts(:thinking).people << new_person
|
50
|
-
end
|
51
|
-
|
52
|
-
assert_queries(1) do
|
53
|
-
assert posts(:thinking).people.include?(new_person)
|
54
|
-
end
|
55
|
-
|
56
|
-
assert posts(:thinking).reload.people(true).include?(new_person)
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_associate_new_by_building
|
60
|
-
assert_queries(1) { posts(:thinking) }
|
61
|
-
|
62
|
-
assert_queries(0) do
|
63
|
-
posts(:thinking).people.build(:first_name=>"Bob")
|
64
|
-
posts(:thinking).people.new(:first_name=>"Ted")
|
65
|
-
end
|
66
|
-
|
67
|
-
# Should only need to load the association once
|
68
|
-
assert_queries(1) do
|
69
|
-
assert posts(:thinking).people.collect(&:first_name).include?("Bob")
|
70
|
-
assert posts(:thinking).people.collect(&:first_name).include?("Ted")
|
71
|
-
end
|
72
|
-
|
73
|
-
# 2 queries for each new record (1 to save the record itself, 1 for the join model)
|
74
|
-
# * 2 new records = 4
|
75
|
-
# + 1 query to save the actual post = 5
|
76
|
-
assert_queries(5) do
|
77
|
-
posts(:thinking).body += '-changed'
|
78
|
-
posts(:thinking).save
|
79
|
-
end
|
80
|
-
|
81
|
-
assert posts(:thinking).reload.people(true).collect(&:first_name).include?("Bob")
|
82
|
-
assert posts(:thinking).reload.people(true).collect(&:first_name).include?("Ted")
|
83
|
-
end
|
84
|
-
|
85
|
-
def test_delete_association
|
86
|
-
assert_queries(2){posts(:welcome);people(:michael); }
|
87
|
-
|
88
|
-
assert_queries(1) do
|
89
|
-
posts(:welcome).people.delete(people(:michael))
|
90
|
-
end
|
91
|
-
|
92
|
-
assert_queries(1) do
|
93
|
-
assert posts(:welcome).people.empty?
|
94
|
-
end
|
95
|
-
|
96
|
-
assert posts(:welcome).reload.people(true).empty?
|
97
|
-
end
|
98
|
-
|
99
|
-
def test_destroy_association
|
100
|
-
assert_difference "Person.count", -1 do
|
101
|
-
posts(:welcome).people.destroy(people(:michael))
|
102
|
-
end
|
103
|
-
|
104
|
-
assert posts(:welcome).reload.people.empty?
|
105
|
-
assert posts(:welcome).people(true).empty?
|
106
|
-
end
|
107
|
-
|
108
|
-
def test_destroy_all
|
109
|
-
assert_difference "Person.count", -1 do
|
110
|
-
posts(:welcome).people.destroy_all
|
111
|
-
end
|
112
|
-
|
113
|
-
assert posts(:welcome).reload.people.empty?
|
114
|
-
assert posts(:welcome).people(true).empty?
|
115
|
-
end
|
116
|
-
|
117
|
-
def test_replace_association
|
118
|
-
assert_queries(4){posts(:welcome);people(:david);people(:michael); posts(:welcome).people(true)}
|
119
|
-
|
120
|
-
# 1 query to delete the existing reader (michael)
|
121
|
-
# 1 query to associate the new reader (david)
|
122
|
-
assert_queries(2) do
|
123
|
-
posts(:welcome).people = [people(:david)]
|
124
|
-
end
|
125
|
-
|
126
|
-
assert_queries(0){
|
127
|
-
assert posts(:welcome).people.include?(people(:david))
|
128
|
-
assert !posts(:welcome).people.include?(people(:michael))
|
129
|
-
}
|
130
|
-
|
131
|
-
assert posts(:welcome).reload.people(true).include?(people(:david))
|
132
|
-
assert !posts(:welcome).reload.people(true).include?(people(:michael))
|
133
|
-
end
|
134
|
-
|
135
|
-
def test_replace_order_is_preserved
|
136
|
-
posts(:welcome).people.clear
|
137
|
-
posts(:welcome).people = [people(:david), people(:michael)]
|
138
|
-
assert_equal [people(:david).id, people(:michael).id], posts(:welcome).readers.all(:order => 'id').map(&:person_id)
|
139
|
-
|
140
|
-
# Test the inverse order in case the first success was a coincidence
|
141
|
-
posts(:welcome).people.clear
|
142
|
-
posts(:welcome).people = [people(:michael), people(:david)]
|
143
|
-
assert_equal [people(:michael).id, people(:david).id], posts(:welcome).readers.all(:order => 'id').map(&:person_id)
|
144
|
-
end
|
145
|
-
|
146
|
-
def test_replace_by_id_order_is_preserved
|
147
|
-
posts(:welcome).people.clear
|
148
|
-
posts(:welcome).person_ids = [people(:david).id, people(:michael).id]
|
149
|
-
assert_equal [people(:david).id, people(:michael).id], posts(:welcome).readers.all(:order => 'id').map(&:person_id)
|
150
|
-
|
151
|
-
# Test the inverse order in case the first success was a coincidence
|
152
|
-
posts(:welcome).people.clear
|
153
|
-
posts(:welcome).person_ids = [people(:michael).id, people(:david).id]
|
154
|
-
assert_equal [people(:michael).id, people(:david).id], posts(:welcome).readers.all(:order => 'id').map(&:person_id)
|
155
|
-
end
|
156
|
-
|
157
|
-
def test_associate_with_create
|
158
|
-
assert_queries(1) { posts(:thinking) }
|
159
|
-
|
160
|
-
# 1 query for the new record, 1 for the join table record
|
161
|
-
# No need to update the actual collection yet!
|
162
|
-
assert_queries(2) do
|
163
|
-
posts(:thinking).people.create(:first_name=>"Jeb")
|
164
|
-
end
|
165
|
-
|
166
|
-
# *Now* we actually need the collection so it's loaded
|
167
|
-
assert_queries(1) do
|
168
|
-
assert posts(:thinking).people.collect(&:first_name).include?("Jeb")
|
169
|
-
end
|
170
|
-
|
171
|
-
assert posts(:thinking).reload.people(true).collect(&:first_name).include?("Jeb")
|
172
|
-
end
|
173
|
-
|
174
|
-
def test_associate_with_create_and_no_options
|
175
|
-
peeps = posts(:thinking).people.count
|
176
|
-
posts(:thinking).people.create(:first_name => 'foo')
|
177
|
-
assert_equal peeps + 1, posts(:thinking).people.count
|
178
|
-
end
|
179
|
-
|
180
|
-
def test_associate_with_create_exclamation_and_no_options
|
181
|
-
peeps = posts(:thinking).people.count
|
182
|
-
posts(:thinking).people.create!(:first_name => 'foo')
|
183
|
-
assert_equal peeps + 1, posts(:thinking).people.count
|
184
|
-
end
|
185
|
-
|
186
|
-
def test_associate_with_create_and_invalid_options
|
187
|
-
peeps = companies(:first_firm).developers.count
|
188
|
-
assert_nothing_raised { companies(:first_firm).developers.create(:name => '0') }
|
189
|
-
assert_equal peeps, companies(:first_firm).developers.count
|
190
|
-
end
|
191
|
-
|
192
|
-
def test_associate_with_create_and_valid_options
|
193
|
-
peeps = companies(:first_firm).developers.count
|
194
|
-
assert_nothing_raised { companies(:first_firm).developers.create(:name => 'developer') }
|
195
|
-
assert_equal peeps + 1, companies(:first_firm).developers.count
|
196
|
-
end
|
197
|
-
|
198
|
-
def test_associate_with_create_bang_and_invalid_options
|
199
|
-
peeps = companies(:first_firm).developers.count
|
200
|
-
assert_raises(ActiveRecord::RecordInvalid) { companies(:first_firm).developers.create!(:name => '0') }
|
201
|
-
assert_equal peeps, companies(:first_firm).developers.count
|
202
|
-
end
|
203
|
-
|
204
|
-
def test_associate_with_create_bang_and_valid_options
|
205
|
-
peeps = companies(:first_firm).developers.count
|
206
|
-
assert_nothing_raised { companies(:first_firm).developers.create!(:name => 'developer') }
|
207
|
-
assert_equal peeps + 1, companies(:first_firm).developers.count
|
208
|
-
end
|
209
|
-
|
210
|
-
def test_clear_associations
|
211
|
-
assert_queries(2) { posts(:welcome);posts(:welcome).people(true) }
|
212
|
-
|
213
|
-
assert_queries(1) do
|
214
|
-
posts(:welcome).people.clear
|
215
|
-
end
|
216
|
-
|
217
|
-
assert_queries(0) do
|
218
|
-
assert posts(:welcome).people.empty?
|
219
|
-
end
|
220
|
-
|
221
|
-
assert posts(:welcome).reload.people(true).empty?
|
222
|
-
end
|
223
|
-
|
224
|
-
def test_association_callback_ordering
|
225
|
-
Post.reset_log
|
226
|
-
log = Post.log
|
227
|
-
post = posts(:thinking)
|
228
|
-
|
229
|
-
post.people_with_callbacks << people(:michael)
|
230
|
-
assert_equal [
|
231
|
-
[:added, :before, "Michael"],
|
232
|
-
[:added, :after, "Michael"]
|
233
|
-
], log.last(2)
|
234
|
-
|
235
|
-
post.people_with_callbacks.push(people(:david), Person.create!(:first_name => "Bob"), Person.new(:first_name => "Lary"))
|
236
|
-
assert_equal [
|
237
|
-
[:added, :before, "David"],
|
238
|
-
[:added, :after, "David"],
|
239
|
-
[:added, :before, "Bob"],
|
240
|
-
[:added, :after, "Bob"],
|
241
|
-
[:added, :before, "Lary"],
|
242
|
-
[:added, :after, "Lary"]
|
243
|
-
],log.last(6)
|
244
|
-
|
245
|
-
post.people_with_callbacks.build(:first_name => "Ted")
|
246
|
-
assert_equal [
|
247
|
-
[:added, :before, "Ted"],
|
248
|
-
[:added, :after, "Ted"]
|
249
|
-
], log.last(2)
|
250
|
-
|
251
|
-
post.people_with_callbacks.create(:first_name => "Sam")
|
252
|
-
assert_equal [
|
253
|
-
[:added, :before, "Sam"],
|
254
|
-
[:added, :after, "Sam"]
|
255
|
-
], log.last(2)
|
256
|
-
|
257
|
-
post.people_with_callbacks = [people(:michael),people(:david), Person.new(:first_name => "Julian"), Person.create!(:first_name => "Roger")]
|
258
|
-
assert_equal (%w(Ted Bob Sam Lary) * 2).sort, log[-12..-5].collect(&:last).sort
|
259
|
-
assert_equal [
|
260
|
-
[:added, :before, "Julian"],
|
261
|
-
[:added, :after, "Julian"],
|
262
|
-
[:added, :before, "Roger"],
|
263
|
-
[:added, :after, "Roger"]
|
264
|
-
], log.last(4)
|
265
|
-
|
266
|
-
post.people_with_callbacks.clear
|
267
|
-
assert_equal (%w(Michael David Julian Roger) * 2).sort, log.last(8).collect(&:last).sort
|
268
|
-
end
|
269
|
-
|
270
|
-
def test_dynamic_find_should_respect_association_include
|
271
|
-
# SQL error in sort clause if :include is not included
|
272
|
-
# due to Unknown column 'comments.id'
|
273
|
-
assert Person.find(1).posts_with_comments_sorted_by_comment_id.find_by_title('Welcome to the weblog')
|
274
|
-
end
|
275
|
-
|
276
|
-
def test_count_with_include_should_alias_join_table
|
277
|
-
assert_equal 2, people(:michael).posts.count(:include => :readers)
|
278
|
-
end
|
279
|
-
|
280
|
-
def test_inner_join_with_quoted_table_name
|
281
|
-
assert_equal 2, people(:michael).jobs.size
|
282
|
-
end
|
283
|
-
|
284
|
-
def test_get_ids
|
285
|
-
assert_equal [posts(:welcome).id, posts(:authorless).id].sort, people(:michael).post_ids.sort
|
286
|
-
end
|
287
|
-
|
288
|
-
def test_get_ids_for_loaded_associations
|
289
|
-
person = people(:michael)
|
290
|
-
person.posts(true)
|
291
|
-
assert_queries(0) do
|
292
|
-
person.post_ids
|
293
|
-
person.post_ids
|
294
|
-
end
|
295
|
-
end
|
296
|
-
|
297
|
-
def test_get_ids_for_unloaded_associations_does_not_load_them
|
298
|
-
person = people(:michael)
|
299
|
-
assert !person.posts.loaded?
|
300
|
-
assert_equal [posts(:welcome).id, posts(:authorless).id].sort, person.post_ids.sort
|
301
|
-
assert !person.posts.loaded?
|
302
|
-
end
|
303
|
-
|
304
|
-
def test_association_proxy_transaction_method_starts_transaction_in_association_class
|
305
|
-
Tag.expects(:transaction)
|
306
|
-
Post.find(:first).tags.transaction do
|
307
|
-
# nothing
|
308
|
-
end
|
309
|
-
end
|
310
|
-
|
311
|
-
def test_has_many_association_through_a_belongs_to_association_where_the_association_doesnt_exist
|
312
|
-
author = authors(:mary)
|
313
|
-
post = Post.create!(:title => "TITLE", :body => "BODY")
|
314
|
-
assert_equal [], post.author_favorites
|
315
|
-
end
|
316
|
-
|
317
|
-
def test_has_many_association_through_a_belongs_to_association
|
318
|
-
author = authors(:mary)
|
319
|
-
post = Post.create!(:author => author, :title => "TITLE", :body => "BODY")
|
320
|
-
author.author_favorites.create(:favorite_author_id => 1)
|
321
|
-
author.author_favorites.create(:favorite_author_id => 2)
|
322
|
-
author.author_favorites.create(:favorite_author_id => 3)
|
323
|
-
assert_equal post.author.author_favorites, post.author_favorites
|
324
|
-
end
|
325
|
-
|
326
|
-
def test_has_many_association_through_a_has_many_association_with_nonstandard_primary_keys
|
327
|
-
assert_equal 1, owners(:blackbeard).toys.count
|
328
|
-
end
|
329
|
-
|
330
|
-
def test_find_on_has_many_association_collection_with_include_and_conditions
|
331
|
-
post_with_no_comments = people(:michael).posts_with_no_comments.first
|
332
|
-
assert_equal post_with_no_comments, posts(:authorless)
|
333
|
-
end
|
334
|
-
|
335
|
-
def test_has_many_through_has_one_reflection
|
336
|
-
assert_equal [comments(:eager_sti_on_associations_vs_comment)], authors(:david).very_special_comments
|
337
|
-
end
|
338
|
-
|
339
|
-
def test_modifying_has_many_through_has_one_reflection_should_raise
|
340
|
-
[
|
341
|
-
lambda { authors(:david).very_special_comments = [VerySpecialComment.create!(:body => "Gorp!", :post_id => 1011), VerySpecialComment.create!(:body => "Eep!", :post_id => 1012)] },
|
342
|
-
lambda { authors(:david).very_special_comments << VerySpecialComment.create!(:body => "Hoohah!", :post_id => 1013) },
|
343
|
-
lambda { authors(:david).very_special_comments.delete(authors(:david).very_special_comments.first) },
|
344
|
-
].each {|block| assert_raise(ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection, &block) }
|
345
|
-
end
|
346
|
-
|
347
|
-
def test_include_method_in_association_through_should_return_true_for_instance_added_with_build
|
348
|
-
person = Person.new
|
349
|
-
reference = person.references.build
|
350
|
-
job = reference.build_job
|
351
|
-
assert person.jobs.include?(job)
|
352
|
-
end
|
353
|
-
|
354
|
-
def test_include_method_in_association_through_should_return_true_for_instance_added_with_nested_builds
|
355
|
-
author = Author.new
|
356
|
-
post = author.posts.build
|
357
|
-
comment = post.comments.build
|
358
|
-
assert author.comments.include?(comment)
|
359
|
-
end
|
360
|
-
end
|
@@ -1,330 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/developer'
|
3
|
-
require 'models/project'
|
4
|
-
require 'models/company'
|
5
|
-
|
6
|
-
class HasOneAssociationsTest < ActiveRecord::TestCase
|
7
|
-
fixtures :accounts, :companies, :developers, :projects, :developers_projects
|
8
|
-
|
9
|
-
def setup
|
10
|
-
Account.destroyed_account_ids.clear
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_has_one
|
14
|
-
assert_equal companies(:first_firm).account, Account.find(1)
|
15
|
-
assert_equal Account.find(1).credit_limit, companies(:first_firm).account.credit_limit
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_has_one_cache_nils
|
19
|
-
firm = companies(:another_firm)
|
20
|
-
assert_queries(1) { assert_nil firm.account }
|
21
|
-
assert_queries(0) { assert_nil firm.account }
|
22
|
-
|
23
|
-
firms = Firm.find(:all, :include => :account)
|
24
|
-
assert_queries(0) { firms.each(&:account) }
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_with_select
|
28
|
-
assert_equal Firm.find(1).account_with_select.attributes.size, 2
|
29
|
-
assert_equal Firm.find(1, :include => :account_with_select).account_with_select.attributes.size, 2
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_finding_using_primary_key
|
33
|
-
firm = companies(:first_firm)
|
34
|
-
assert_equal Account.find_by_firm_id(firm.id), firm.account
|
35
|
-
firm.firm_id = companies(:rails_core).id
|
36
|
-
assert_equal accounts(:rails_core_account), firm.account_using_primary_key
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_update_with_foreign_and_primary_keys
|
40
|
-
firm = companies(:first_firm)
|
41
|
-
account = firm.account_using_foreign_and_primary_keys
|
42
|
-
assert_equal Account.find_by_firm_name(firm.name), account
|
43
|
-
firm.save
|
44
|
-
firm.reload
|
45
|
-
assert_equal account, firm.account_using_foreign_and_primary_keys
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_can_marshal_has_one_association_with_nil_target
|
49
|
-
firm = Firm.new
|
50
|
-
assert_nothing_raised do
|
51
|
-
assert_equal firm.attributes, Marshal.load(Marshal.dump(firm)).attributes
|
52
|
-
end
|
53
|
-
|
54
|
-
firm.account
|
55
|
-
assert_nothing_raised do
|
56
|
-
assert_equal firm.attributes, Marshal.load(Marshal.dump(firm)).attributes
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_proxy_assignment
|
61
|
-
company = companies(:first_firm)
|
62
|
-
assert_nothing_raised { company.account = company.account }
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_triple_equality
|
66
|
-
assert Account === companies(:first_firm).account
|
67
|
-
assert companies(:first_firm).account === Account
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_type_mismatch
|
71
|
-
assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).account = 1 }
|
72
|
-
assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).account = Project.find(1) }
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_natural_assignment
|
76
|
-
apple = Firm.create("name" => "Apple")
|
77
|
-
citibank = Account.create("credit_limit" => 10)
|
78
|
-
apple.account = citibank
|
79
|
-
assert_equal apple.id, citibank.firm_id
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_natural_assignment_to_nil
|
83
|
-
old_account_id = companies(:first_firm).account.id
|
84
|
-
companies(:first_firm).account = nil
|
85
|
-
companies(:first_firm).save
|
86
|
-
assert_nil companies(:first_firm).account
|
87
|
-
# account is dependent, therefore is destroyed when reference to owner is lost
|
88
|
-
assert_raise(ActiveRecord::RecordNotFound) { Account.find(old_account_id) }
|
89
|
-
end
|
90
|
-
|
91
|
-
def test_nullification_on_association_change
|
92
|
-
firm = companies(:rails_core)
|
93
|
-
old_account_id = firm.account.id
|
94
|
-
firm.account = Account.new
|
95
|
-
# account is dependent with nullify, therefore its firm_id should be nil
|
96
|
-
assert_nil Account.find(old_account_id).firm_id
|
97
|
-
end
|
98
|
-
|
99
|
-
def test_association_changecalls_delete
|
100
|
-
companies(:first_firm).deletable_account = Account.new
|
101
|
-
assert_equal [], Account.destroyed_account_ids[companies(:first_firm).id]
|
102
|
-
end
|
103
|
-
|
104
|
-
def test_association_change_calls_destroy
|
105
|
-
companies(:first_firm).account = Account.new
|
106
|
-
assert_equal [companies(:first_firm).id], Account.destroyed_account_ids[companies(:first_firm).id]
|
107
|
-
end
|
108
|
-
|
109
|
-
def test_natural_assignment_to_already_associated_record
|
110
|
-
company = companies(:first_firm)
|
111
|
-
account = accounts(:signals37)
|
112
|
-
assert_equal company.account, account
|
113
|
-
company.account = account
|
114
|
-
company.reload
|
115
|
-
account.reload
|
116
|
-
assert_equal company.account, account
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_assignment_without_replacement
|
120
|
-
apple = Firm.create("name" => "Apple")
|
121
|
-
citibank = Account.create("credit_limit" => 10)
|
122
|
-
apple.account = citibank
|
123
|
-
assert_equal apple.id, citibank.firm_id
|
124
|
-
|
125
|
-
hsbc = apple.build_account({ :credit_limit => 20}, false)
|
126
|
-
assert_equal apple.id, hsbc.firm_id
|
127
|
-
hsbc.save
|
128
|
-
assert_equal apple.id, citibank.firm_id
|
129
|
-
|
130
|
-
nykredit = apple.create_account({ :credit_limit => 30}, false)
|
131
|
-
assert_equal apple.id, nykredit.firm_id
|
132
|
-
assert_equal apple.id, citibank.firm_id
|
133
|
-
assert_equal apple.id, hsbc.firm_id
|
134
|
-
end
|
135
|
-
|
136
|
-
def test_assignment_without_replacement_on_create
|
137
|
-
apple = Firm.create("name" => "Apple")
|
138
|
-
citibank = Account.create("credit_limit" => 10)
|
139
|
-
apple.account = citibank
|
140
|
-
assert_equal apple.id, citibank.firm_id
|
141
|
-
|
142
|
-
hsbc = apple.create_account({:credit_limit => 10}, false)
|
143
|
-
assert_equal apple.id, hsbc.firm_id
|
144
|
-
hsbc.save
|
145
|
-
assert_equal apple.id, citibank.firm_id
|
146
|
-
end
|
147
|
-
|
148
|
-
def test_dependence
|
149
|
-
num_accounts = Account.count
|
150
|
-
|
151
|
-
firm = Firm.find(1)
|
152
|
-
assert !firm.account.nil?
|
153
|
-
account_id = firm.account.id
|
154
|
-
assert_equal [], Account.destroyed_account_ids[firm.id]
|
155
|
-
|
156
|
-
firm.destroy
|
157
|
-
assert_equal num_accounts - 1, Account.count
|
158
|
-
assert_equal [account_id], Account.destroyed_account_ids[firm.id]
|
159
|
-
end
|
160
|
-
|
161
|
-
def test_exclusive_dependence
|
162
|
-
num_accounts = Account.count
|
163
|
-
|
164
|
-
firm = ExclusivelyDependentFirm.find(9)
|
165
|
-
assert !firm.account.nil?
|
166
|
-
account_id = firm.account.id
|
167
|
-
assert_equal [], Account.destroyed_account_ids[firm.id]
|
168
|
-
|
169
|
-
firm.destroy
|
170
|
-
assert_equal num_accounts - 1, Account.count
|
171
|
-
assert_equal [], Account.destroyed_account_ids[firm.id]
|
172
|
-
end
|
173
|
-
|
174
|
-
def test_dependence_with_nil_associate
|
175
|
-
firm = DependentFirm.new(:name => 'nullify')
|
176
|
-
firm.save!
|
177
|
-
assert_nothing_raised { firm.destroy }
|
178
|
-
end
|
179
|
-
|
180
|
-
def test_succesful_build_association
|
181
|
-
firm = Firm.new("name" => "GlobalMegaCorp")
|
182
|
-
firm.save
|
183
|
-
|
184
|
-
account = firm.build_account("credit_limit" => 1000)
|
185
|
-
assert account.save
|
186
|
-
assert_equal account, firm.account
|
187
|
-
end
|
188
|
-
|
189
|
-
def test_failing_build_association
|
190
|
-
firm = Firm.new("name" => "GlobalMegaCorp")
|
191
|
-
firm.save
|
192
|
-
|
193
|
-
account = firm.build_account
|
194
|
-
assert !account.save
|
195
|
-
assert_equal "can't be empty", account.errors.on("credit_limit")
|
196
|
-
end
|
197
|
-
|
198
|
-
def test_build_association_twice_without_saving_affects_nothing
|
199
|
-
count_of_account = Account.count
|
200
|
-
firm = Firm.find(:first)
|
201
|
-
account1 = firm.build_account("credit_limit" => 1000)
|
202
|
-
account2 = firm.build_account("credit_limit" => 2000)
|
203
|
-
|
204
|
-
assert_equal count_of_account, Account.count
|
205
|
-
end
|
206
|
-
|
207
|
-
def test_create_association
|
208
|
-
firm = Firm.create(:name => "GlobalMegaCorp")
|
209
|
-
account = firm.create_account(:credit_limit => 1000)
|
210
|
-
assert_equal account, firm.reload.account
|
211
|
-
end
|
212
|
-
|
213
|
-
def test_build
|
214
|
-
firm = Firm.new("name" => "GlobalMegaCorp")
|
215
|
-
firm.save
|
216
|
-
|
217
|
-
firm.account = account = Account.new("credit_limit" => 1000)
|
218
|
-
assert_equal account, firm.account
|
219
|
-
assert account.save
|
220
|
-
assert_equal account, firm.account
|
221
|
-
end
|
222
|
-
|
223
|
-
def test_failing_build_association
|
224
|
-
firm = Firm.new("name" => "GlobalMegaCorp")
|
225
|
-
firm.save
|
226
|
-
|
227
|
-
firm.account = account = Account.new
|
228
|
-
assert_equal account, firm.account
|
229
|
-
assert !account.save
|
230
|
-
assert_equal account, firm.account
|
231
|
-
assert_equal "can't be empty", account.errors.on("credit_limit")
|
232
|
-
end
|
233
|
-
|
234
|
-
def test_create
|
235
|
-
firm = Firm.new("name" => "GlobalMegaCorp")
|
236
|
-
firm.save
|
237
|
-
firm.account = account = Account.create("credit_limit" => 1000)
|
238
|
-
assert_equal account, firm.account
|
239
|
-
end
|
240
|
-
|
241
|
-
def test_create_before_save
|
242
|
-
firm = Firm.new("name" => "GlobalMegaCorp")
|
243
|
-
firm.account = account = Account.create("credit_limit" => 1000)
|
244
|
-
assert_equal account, firm.account
|
245
|
-
end
|
246
|
-
|
247
|
-
def test_dependence_with_missing_association
|
248
|
-
Account.destroy_all
|
249
|
-
firm = Firm.find(1)
|
250
|
-
assert firm.account.nil?
|
251
|
-
firm.destroy
|
252
|
-
end
|
253
|
-
|
254
|
-
def test_dependence_with_missing_association_and_nullify
|
255
|
-
Account.destroy_all
|
256
|
-
firm = DependentFirm.find(:first)
|
257
|
-
assert firm.account.nil?
|
258
|
-
firm.destroy
|
259
|
-
end
|
260
|
-
|
261
|
-
def test_finding_with_interpolated_condition
|
262
|
-
firm = Firm.find(:first)
|
263
|
-
superior = firm.clients.create(:name => 'SuperiorCo')
|
264
|
-
superior.rating = 10
|
265
|
-
superior.save
|
266
|
-
assert_equal 10, firm.clients_with_interpolated_conditions.first.rating
|
267
|
-
end
|
268
|
-
|
269
|
-
def test_assignment_before_child_saved
|
270
|
-
firm = Firm.find(1)
|
271
|
-
firm.account = a = Account.new("credit_limit" => 1000)
|
272
|
-
assert !a.new_record?
|
273
|
-
assert_equal a, firm.account
|
274
|
-
assert_equal a, firm.account
|
275
|
-
assert_equal a, firm.account(true)
|
276
|
-
end
|
277
|
-
|
278
|
-
def test_save_still_works_after_accessing_nil_has_one
|
279
|
-
jp = Company.new :name => 'Jaded Pixel'
|
280
|
-
jp.dummy_account.nil?
|
281
|
-
|
282
|
-
assert_nothing_raised do
|
283
|
-
jp.save!
|
284
|
-
end
|
285
|
-
end
|
286
|
-
|
287
|
-
def test_cant_save_readonly_association
|
288
|
-
assert_raise(ActiveRecord::ReadOnlyRecord) { companies(:first_firm).readonly_account.save! }
|
289
|
-
assert companies(:first_firm).readonly_account.readonly?
|
290
|
-
end
|
291
|
-
|
292
|
-
def test_has_one_proxy_should_not_respond_to_private_methods
|
293
|
-
assert_raise(NoMethodError) { accounts(:signals37).private_method }
|
294
|
-
assert_raise(NoMethodError) { companies(:first_firm).account.private_method }
|
295
|
-
end
|
296
|
-
|
297
|
-
def test_has_one_proxy_should_respond_to_private_methods_via_send
|
298
|
-
accounts(:signals37).send(:private_method)
|
299
|
-
companies(:first_firm).account.send(:private_method)
|
300
|
-
end
|
301
|
-
|
302
|
-
def test_save_of_record_with_loaded_has_one
|
303
|
-
@firm = companies(:first_firm)
|
304
|
-
assert_not_nil @firm.account
|
305
|
-
|
306
|
-
assert_nothing_raised do
|
307
|
-
Firm.find(@firm.id).save!
|
308
|
-
Firm.find(@firm.id, :include => :account).save!
|
309
|
-
end
|
310
|
-
|
311
|
-
@firm.account.destroy
|
312
|
-
|
313
|
-
assert_nothing_raised do
|
314
|
-
Firm.find(@firm.id).save!
|
315
|
-
Firm.find(@firm.id, :include => :account).save!
|
316
|
-
end
|
317
|
-
end
|
318
|
-
|
319
|
-
def test_build_respects_hash_condition
|
320
|
-
account = companies(:first_firm).build_account_limit_500_with_hash_conditions
|
321
|
-
assert account.save
|
322
|
-
assert_equal 500, account.credit_limit
|
323
|
-
end
|
324
|
-
|
325
|
-
def test_create_respects_hash_condition
|
326
|
-
account = companies(:first_firm).create_account_limit_500_with_hash_conditions
|
327
|
-
assert !account.new_record?
|
328
|
-
assert_equal 500, account.credit_limit
|
329
|
-
end
|
330
|
-
end
|