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,712 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/tag'
|
3
|
-
require 'models/tagging'
|
4
|
-
require 'models/post'
|
5
|
-
require 'models/item'
|
6
|
-
require 'models/comment'
|
7
|
-
require 'models/author'
|
8
|
-
require 'models/category'
|
9
|
-
require 'models/categorization'
|
10
|
-
require 'models/vertex'
|
11
|
-
require 'models/edge'
|
12
|
-
require 'models/book'
|
13
|
-
require 'models/citation'
|
14
|
-
|
15
|
-
class AssociationsJoinModelTest < ActiveRecord::TestCase
|
16
|
-
self.use_transactional_fixtures = false
|
17
|
-
fixtures :posts, :authors, :categories, :categorizations, :comments, :tags, :taggings, :author_favorites, :vertices, :items, :books
|
18
|
-
|
19
|
-
def test_has_many
|
20
|
-
assert authors(:david).categories.include?(categories(:general))
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_has_many_inherited
|
24
|
-
assert authors(:mary).categories.include?(categories(:sti_test))
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_inherited_has_many
|
28
|
-
assert categories(:sti_test).authors.include?(authors(:mary))
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_has_many_uniq_through_join_model
|
32
|
-
assert_equal 2, authors(:mary).categorized_posts.size
|
33
|
-
assert_equal 1, authors(:mary).unique_categorized_posts.size
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_has_many_uniq_through_count
|
37
|
-
author = authors(:mary)
|
38
|
-
assert !authors(:mary).unique_categorized_posts.loaded?
|
39
|
-
assert_queries(1) { assert_equal 1, author.unique_categorized_posts.count }
|
40
|
-
assert_queries(1) { assert_equal 1, author.unique_categorized_posts.count(:title) }
|
41
|
-
assert_queries(1) { assert_equal 0, author.unique_categorized_posts.count(:title, :conditions => "title is NULL") }
|
42
|
-
assert !authors(:mary).unique_categorized_posts.loaded?
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_has_many_uniq_through_find
|
46
|
-
assert_equal 1, authors(:mary).unique_categorized_posts.find(:all).size
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_has_many_uniq_through_dynamic_find
|
50
|
-
assert_equal 1, authors(:mary).unique_categorized_posts.find_all_by_title("So I was thinking").size
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_polymorphic_has_many
|
54
|
-
assert posts(:welcome).taggings.include?(taggings(:welcome_general))
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_polymorphic_has_one
|
58
|
-
assert_equal taggings(:welcome_general), posts(:welcome).tagging
|
59
|
-
end
|
60
|
-
|
61
|
-
def test_polymorphic_belongs_to
|
62
|
-
assert_equal posts(:welcome), posts(:welcome).taggings.first.taggable
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_polymorphic_has_many_going_through_join_model
|
66
|
-
assert_equal tags(:general), tag = posts(:welcome).tags.first
|
67
|
-
assert_no_queries do
|
68
|
-
tag.tagging
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_count_polymorphic_has_many
|
73
|
-
assert_equal 1, posts(:welcome).taggings.count
|
74
|
-
assert_equal 1, posts(:welcome).tags.count
|
75
|
-
end
|
76
|
-
|
77
|
-
def test_polymorphic_has_many_going_through_join_model_with_find
|
78
|
-
assert_equal tags(:general), tag = posts(:welcome).tags.find(:first)
|
79
|
-
assert_no_queries do
|
80
|
-
tag.tagging
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def test_polymorphic_has_many_going_through_join_model_with_include_on_source_reflection
|
85
|
-
assert_equal tags(:general), tag = posts(:welcome).funky_tags.first
|
86
|
-
assert_no_queries do
|
87
|
-
tag.tagging
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def test_polymorphic_has_many_going_through_join_model_with_include_on_source_reflection_with_find
|
92
|
-
assert_equal tags(:general), tag = posts(:welcome).funky_tags.find(:first)
|
93
|
-
assert_no_queries do
|
94
|
-
tag.tagging
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def test_polymorphic_has_many_going_through_join_model_with_disabled_include
|
99
|
-
assert_equal tags(:general), tag = posts(:welcome).tags.add_joins_and_select.first
|
100
|
-
assert_queries 1 do
|
101
|
-
tag.tagging
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def test_polymorphic_has_many_going_through_join_model_with_custom_select_and_joins
|
106
|
-
assert_equal tags(:general), tag = posts(:welcome).tags.add_joins_and_select.first
|
107
|
-
tag.author_id
|
108
|
-
end
|
109
|
-
|
110
|
-
def test_polymorphic_has_many_going_through_join_model_with_custom_foreign_key
|
111
|
-
assert_equal tags(:misc), taggings(:welcome_general).super_tag
|
112
|
-
assert_equal tags(:misc), posts(:welcome).super_tags.first
|
113
|
-
end
|
114
|
-
|
115
|
-
def test_polymorphic_has_many_create_model_with_inheritance_and_custom_base_class
|
116
|
-
post = SubStiPost.create :title => 'SubStiPost', :body => 'SubStiPost body'
|
117
|
-
assert_instance_of SubStiPost, post
|
118
|
-
|
119
|
-
tagging = tags(:misc).taggings.create(:taggable => post)
|
120
|
-
assert_equal "SubStiPost", tagging.taggable_type
|
121
|
-
end
|
122
|
-
|
123
|
-
def test_polymorphic_has_many_going_through_join_model_with_inheritance
|
124
|
-
assert_equal tags(:general), posts(:thinking).tags.first
|
125
|
-
end
|
126
|
-
|
127
|
-
def test_polymorphic_has_many_going_through_join_model_with_inheritance_with_custom_class_name
|
128
|
-
assert_equal tags(:general), posts(:thinking).funky_tags.first
|
129
|
-
end
|
130
|
-
|
131
|
-
def test_polymorphic_has_many_create_model_with_inheritance
|
132
|
-
post = posts(:thinking)
|
133
|
-
assert_instance_of SpecialPost, post
|
134
|
-
|
135
|
-
tagging = tags(:misc).taggings.create(:taggable => post)
|
136
|
-
assert_equal "Post", tagging.taggable_type
|
137
|
-
end
|
138
|
-
|
139
|
-
def test_polymorphic_has_one_create_model_with_inheritance
|
140
|
-
tagging = tags(:misc).create_tagging(:taggable => posts(:thinking))
|
141
|
-
assert_equal "Post", tagging.taggable_type
|
142
|
-
end
|
143
|
-
|
144
|
-
def test_set_polymorphic_has_many
|
145
|
-
tagging = tags(:misc).taggings.create
|
146
|
-
posts(:thinking).taggings << tagging
|
147
|
-
assert_equal "Post", tagging.taggable_type
|
148
|
-
end
|
149
|
-
|
150
|
-
def test_set_polymorphic_has_one
|
151
|
-
tagging = tags(:misc).taggings.create
|
152
|
-
posts(:thinking).tagging = tagging
|
153
|
-
assert_equal "Post", tagging.taggable_type
|
154
|
-
end
|
155
|
-
|
156
|
-
def test_create_polymorphic_has_many_with_scope
|
157
|
-
old_count = posts(:welcome).taggings.count
|
158
|
-
tagging = posts(:welcome).taggings.create(:tag => tags(:misc))
|
159
|
-
assert_equal "Post", tagging.taggable_type
|
160
|
-
assert_equal old_count+1, posts(:welcome).taggings.count
|
161
|
-
end
|
162
|
-
|
163
|
-
def test_create_bang_polymorphic_with_has_many_scope
|
164
|
-
old_count = posts(:welcome).taggings.count
|
165
|
-
tagging = posts(:welcome).taggings.create!(:tag => tags(:misc))
|
166
|
-
assert_equal "Post", tagging.taggable_type
|
167
|
-
assert_equal old_count+1, posts(:welcome).taggings.count
|
168
|
-
end
|
169
|
-
|
170
|
-
def test_create_polymorphic_has_one_with_scope
|
171
|
-
old_count = Tagging.count
|
172
|
-
tagging = posts(:welcome).tagging.create(:tag => tags(:misc))
|
173
|
-
assert_equal "Post", tagging.taggable_type
|
174
|
-
assert_equal old_count+1, Tagging.count
|
175
|
-
end
|
176
|
-
|
177
|
-
def test_delete_polymorphic_has_many_with_delete_all
|
178
|
-
assert_equal 1, posts(:welcome).taggings.count
|
179
|
-
posts(:welcome).taggings.first.update_attribute :taggable_type, 'PostWithHasManyDeleteAll'
|
180
|
-
post = find_post_with_dependency(1, :has_many, :taggings, :delete_all)
|
181
|
-
|
182
|
-
old_count = Tagging.count
|
183
|
-
post.destroy
|
184
|
-
assert_equal old_count-1, Tagging.count
|
185
|
-
assert_equal 0, posts(:welcome).taggings.count
|
186
|
-
end
|
187
|
-
|
188
|
-
def test_delete_polymorphic_has_many_with_destroy
|
189
|
-
assert_equal 1, posts(:welcome).taggings.count
|
190
|
-
posts(:welcome).taggings.first.update_attribute :taggable_type, 'PostWithHasManyDestroy'
|
191
|
-
post = find_post_with_dependency(1, :has_many, :taggings, :destroy)
|
192
|
-
|
193
|
-
old_count = Tagging.count
|
194
|
-
post.destroy
|
195
|
-
assert_equal old_count-1, Tagging.count
|
196
|
-
assert_equal 0, posts(:welcome).taggings.count
|
197
|
-
end
|
198
|
-
|
199
|
-
def test_delete_polymorphic_has_many_with_nullify
|
200
|
-
assert_equal 1, posts(:welcome).taggings.count
|
201
|
-
posts(:welcome).taggings.first.update_attribute :taggable_type, 'PostWithHasManyNullify'
|
202
|
-
post = find_post_with_dependency(1, :has_many, :taggings, :nullify)
|
203
|
-
|
204
|
-
old_count = Tagging.count
|
205
|
-
post.destroy
|
206
|
-
assert_equal old_count, Tagging.count
|
207
|
-
assert_equal 0, posts(:welcome).taggings.count
|
208
|
-
end
|
209
|
-
|
210
|
-
def test_delete_polymorphic_has_one_with_destroy
|
211
|
-
assert posts(:welcome).tagging
|
212
|
-
posts(:welcome).tagging.update_attribute :taggable_type, 'PostWithHasOneDestroy'
|
213
|
-
post = find_post_with_dependency(1, :has_one, :tagging, :destroy)
|
214
|
-
|
215
|
-
old_count = Tagging.count
|
216
|
-
post.destroy
|
217
|
-
assert_equal old_count-1, Tagging.count
|
218
|
-
assert_nil posts(:welcome).tagging(true)
|
219
|
-
end
|
220
|
-
|
221
|
-
def test_delete_polymorphic_has_one_with_nullify
|
222
|
-
assert posts(:welcome).tagging
|
223
|
-
posts(:welcome).tagging.update_attribute :taggable_type, 'PostWithHasOneNullify'
|
224
|
-
post = find_post_with_dependency(1, :has_one, :tagging, :nullify)
|
225
|
-
|
226
|
-
old_count = Tagging.count
|
227
|
-
post.destroy
|
228
|
-
assert_equal old_count, Tagging.count
|
229
|
-
assert_nil posts(:welcome).tagging(true)
|
230
|
-
end
|
231
|
-
|
232
|
-
def test_has_many_with_piggyback
|
233
|
-
assert_equal "2", categories(:sti_test).authors.first.post_id.to_s
|
234
|
-
end
|
235
|
-
|
236
|
-
def test_include_has_many_through
|
237
|
-
posts = Post.find(:all, :order => 'posts.id')
|
238
|
-
posts_with_authors = Post.find(:all, :include => :authors, :order => 'posts.id')
|
239
|
-
assert_equal posts.length, posts_with_authors.length
|
240
|
-
posts.length.times do |i|
|
241
|
-
assert_equal posts[i].authors.length, assert_no_queries { posts_with_authors[i].authors.length }
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
|
-
def test_include_polymorphic_has_one
|
246
|
-
post = Post.find_by_id(posts(:welcome).id, :include => :tagging)
|
247
|
-
tagging = taggings(:welcome_general)
|
248
|
-
assert_no_queries do
|
249
|
-
assert_equal tagging, post.tagging
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
def test_include_polymorphic_has_one_defined_in_abstract_parent
|
254
|
-
item = Item.find_by_id(items(:dvd).id, :include => :tagging)
|
255
|
-
tagging = taggings(:godfather)
|
256
|
-
assert_no_queries do
|
257
|
-
assert_equal tagging, item.tagging
|
258
|
-
end
|
259
|
-
end
|
260
|
-
|
261
|
-
def test_include_polymorphic_has_many_through
|
262
|
-
posts = Post.find(:all, :order => 'posts.id')
|
263
|
-
posts_with_tags = Post.find(:all, :include => :tags, :order => 'posts.id')
|
264
|
-
assert_equal posts.length, posts_with_tags.length
|
265
|
-
posts.length.times do |i|
|
266
|
-
assert_equal posts[i].tags.length, assert_no_queries { posts_with_tags[i].tags.length }
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
def test_include_polymorphic_has_many
|
271
|
-
posts = Post.find(:all, :order => 'posts.id')
|
272
|
-
posts_with_taggings = Post.find(:all, :include => :taggings, :order => 'posts.id')
|
273
|
-
assert_equal posts.length, posts_with_taggings.length
|
274
|
-
posts.length.times do |i|
|
275
|
-
assert_equal posts[i].taggings.length, assert_no_queries { posts_with_taggings[i].taggings.length }
|
276
|
-
end
|
277
|
-
end
|
278
|
-
|
279
|
-
def test_has_many_find_all
|
280
|
-
assert_equal [categories(:general)], authors(:david).categories.find(:all)
|
281
|
-
end
|
282
|
-
|
283
|
-
def test_has_many_find_first
|
284
|
-
assert_equal categories(:general), authors(:david).categories.find(:first)
|
285
|
-
end
|
286
|
-
|
287
|
-
def test_has_many_with_hash_conditions
|
288
|
-
assert_equal categories(:general), authors(:david).categories_like_general.find(:first)
|
289
|
-
end
|
290
|
-
|
291
|
-
def test_has_many_find_conditions
|
292
|
-
assert_equal categories(:general), authors(:david).categories.find(:first, :conditions => "categories.name = 'General'")
|
293
|
-
assert_equal nil, authors(:david).categories.find(:first, :conditions => "categories.name = 'Technology'")
|
294
|
-
end
|
295
|
-
|
296
|
-
def test_has_many_class_methods_called_by_method_missing
|
297
|
-
assert_equal categories(:general), authors(:david).categories.find_all_by_name('General').first
|
298
|
-
assert_equal nil, authors(:david).categories.find_by_name('Technology')
|
299
|
-
end
|
300
|
-
|
301
|
-
def test_has_many_array_methods_called_by_method_missing
|
302
|
-
assert true, authors(:david).categories.any? { |category| category.name == 'General' }
|
303
|
-
assert_nothing_raised { authors(:david).categories.sort }
|
304
|
-
end
|
305
|
-
|
306
|
-
def test_has_many_going_through_join_model_with_custom_foreign_key
|
307
|
-
assert_equal [], posts(:thinking).authors
|
308
|
-
assert_equal [authors(:mary)], posts(:authorless).authors
|
309
|
-
end
|
310
|
-
|
311
|
-
def test_both_scoped_and_explicit_joins_should_be_respected
|
312
|
-
assert_nothing_raised do
|
313
|
-
Post.send(:with_scope, :find => {:joins => "left outer join comments on comments.id = posts.id"}) do
|
314
|
-
Post.find :all, :select => "comments.id, authors.id", :joins => "left outer join authors on authors.id = posts.author_id"
|
315
|
-
end
|
316
|
-
end
|
317
|
-
end
|
318
|
-
|
319
|
-
def test_belongs_to_polymorphic_with_counter_cache
|
320
|
-
assert_equal 1, posts(:welcome)[:taggings_count]
|
321
|
-
tagging = posts(:welcome).taggings.create(:tag => tags(:general))
|
322
|
-
assert_equal 2, posts(:welcome, :reload)[:taggings_count]
|
323
|
-
tagging.destroy
|
324
|
-
assert_equal 1, posts(:welcome, :reload)[:taggings_count]
|
325
|
-
end
|
326
|
-
|
327
|
-
def test_unavailable_through_reflection
|
328
|
-
assert_raise(ActiveRecord::HasManyThroughAssociationNotFoundError) { authors(:david).nothings }
|
329
|
-
end
|
330
|
-
|
331
|
-
def test_has_many_through_join_model_with_conditions
|
332
|
-
assert_equal [], posts(:welcome).invalid_taggings
|
333
|
-
assert_equal [], posts(:welcome).invalid_tags
|
334
|
-
end
|
335
|
-
|
336
|
-
def test_has_many_polymorphic
|
337
|
-
assert_raise ActiveRecord::HasManyThroughAssociationPolymorphicError do
|
338
|
-
assert_equal posts(:welcome, :thinking), tags(:general).taggables
|
339
|
-
end
|
340
|
-
assert_raise ActiveRecord::EagerLoadPolymorphicError do
|
341
|
-
assert_equal posts(:welcome, :thinking), tags(:general).taggings.find(:all, :include => :taggable, :conditions => 'bogus_table.column = 1')
|
342
|
-
end
|
343
|
-
end
|
344
|
-
|
345
|
-
def test_has_many_polymorphic_with_source_type
|
346
|
-
assert_equal posts(:welcome, :thinking), tags(:general).tagged_posts
|
347
|
-
end
|
348
|
-
|
349
|
-
def test_eager_has_many_polymorphic_with_source_type
|
350
|
-
tag_with_include = Tag.find(tags(:general).id, :include => :tagged_posts)
|
351
|
-
desired = posts(:welcome, :thinking)
|
352
|
-
assert_no_queries do
|
353
|
-
assert_equal desired, tag_with_include.tagged_posts
|
354
|
-
end
|
355
|
-
assert_equal 5, tag_with_include.taggings.length
|
356
|
-
end
|
357
|
-
|
358
|
-
def test_has_many_through_has_many_find_all
|
359
|
-
assert_equal comments(:greetings), authors(:david).comments.find(:all, :order => 'comments.id').first
|
360
|
-
end
|
361
|
-
|
362
|
-
def test_has_many_through_has_many_find_all_with_custom_class
|
363
|
-
assert_equal comments(:greetings), authors(:david).funky_comments.find(:all, :order => 'comments.id').first
|
364
|
-
end
|
365
|
-
|
366
|
-
def test_has_many_through_has_many_find_first
|
367
|
-
assert_equal comments(:greetings), authors(:david).comments.find(:first, :order => 'comments.id')
|
368
|
-
end
|
369
|
-
|
370
|
-
def test_has_many_through_has_many_find_conditions
|
371
|
-
options = { :conditions => "comments.#{QUOTED_TYPE}='SpecialComment'", :order => 'comments.id' }
|
372
|
-
assert_equal comments(:does_it_hurt), authors(:david).comments.find(:first, options)
|
373
|
-
end
|
374
|
-
|
375
|
-
def test_has_many_through_has_many_find_by_id
|
376
|
-
assert_equal comments(:more_greetings), authors(:david).comments.find(2)
|
377
|
-
end
|
378
|
-
|
379
|
-
def test_has_many_through_polymorphic_has_one
|
380
|
-
assert_equal Tagging.find(1,2).sort_by { |t| t.id }, authors(:david).tagging
|
381
|
-
end
|
382
|
-
|
383
|
-
def test_has_many_through_polymorphic_has_many
|
384
|
-
assert_equal taggings(:welcome_general, :thinking_general), authors(:david).taggings.uniq.sort_by { |t| t.id }
|
385
|
-
end
|
386
|
-
|
387
|
-
def test_include_has_many_through_polymorphic_has_many
|
388
|
-
author = Author.find_by_id(authors(:david).id, :include => :taggings)
|
389
|
-
expected_taggings = taggings(:welcome_general, :thinking_general)
|
390
|
-
assert_no_queries do
|
391
|
-
assert_equal expected_taggings, author.taggings.uniq.sort_by { |t| t.id }
|
392
|
-
end
|
393
|
-
end
|
394
|
-
|
395
|
-
def test_has_many_through_has_many_through
|
396
|
-
assert_raise(ActiveRecord::HasManyThroughSourceAssociationMacroError) { authors(:david).tags }
|
397
|
-
end
|
398
|
-
|
399
|
-
def test_has_many_through_habtm
|
400
|
-
assert_raise(ActiveRecord::HasManyThroughSourceAssociationMacroError) { authors(:david).post_categories }
|
401
|
-
end
|
402
|
-
|
403
|
-
def test_eager_load_has_many_through_has_many
|
404
|
-
author = Author.find :first, :conditions => ['name = ?', 'David'], :include => :comments, :order => 'comments.id'
|
405
|
-
SpecialComment.new; VerySpecialComment.new
|
406
|
-
assert_no_queries do
|
407
|
-
assert_equal [1,2,3,5,6,7,8,9,10], author.comments.collect(&:id)
|
408
|
-
end
|
409
|
-
end
|
410
|
-
|
411
|
-
def test_eager_load_has_many_through_has_many_with_conditions
|
412
|
-
post = Post.find(:first, :include => :invalid_tags)
|
413
|
-
assert_no_queries do
|
414
|
-
post.invalid_tags
|
415
|
-
end
|
416
|
-
end
|
417
|
-
|
418
|
-
def test_eager_belongs_to_and_has_one_not_singularized
|
419
|
-
assert_nothing_raised do
|
420
|
-
Author.find(:first, :include => :author_address)
|
421
|
-
AuthorAddress.find(:first, :include => :author)
|
422
|
-
end
|
423
|
-
end
|
424
|
-
|
425
|
-
def test_self_referential_has_many_through
|
426
|
-
assert_equal [authors(:mary)], authors(:david).favorite_authors
|
427
|
-
assert_equal [], authors(:mary).favorite_authors
|
428
|
-
end
|
429
|
-
|
430
|
-
def test_add_to_self_referential_has_many_through
|
431
|
-
new_author = Author.create(:name => "Bob")
|
432
|
-
authors(:david).author_favorites.create :favorite_author => new_author
|
433
|
-
assert_equal new_author, authors(:david).reload.favorite_authors.first
|
434
|
-
end
|
435
|
-
|
436
|
-
def test_has_many_through_uses_conditions_specified_on_the_has_many_association
|
437
|
-
author = Author.find(:first)
|
438
|
-
assert !author.comments.blank?
|
439
|
-
assert author.nonexistant_comments.blank?
|
440
|
-
end
|
441
|
-
|
442
|
-
def test_has_many_through_uses_correct_attributes
|
443
|
-
assert_nil posts(:thinking).tags.find_by_name("General").attributes["tag_id"]
|
444
|
-
end
|
445
|
-
|
446
|
-
def test_associating_unsaved_records_with_has_many_through
|
447
|
-
saved_post = posts(:thinking)
|
448
|
-
new_tag = Tag.new(:name => "new")
|
449
|
-
|
450
|
-
saved_post.tags << new_tag
|
451
|
-
assert !new_tag.new_record? #consistent with habtm!
|
452
|
-
assert !saved_post.new_record?
|
453
|
-
assert saved_post.tags.include?(new_tag)
|
454
|
-
|
455
|
-
assert !new_tag.new_record?
|
456
|
-
assert saved_post.reload.tags(true).include?(new_tag)
|
457
|
-
|
458
|
-
|
459
|
-
new_post = Post.new(:title => "Association replacmenet works!", :body => "You best believe it.")
|
460
|
-
saved_tag = tags(:general)
|
461
|
-
|
462
|
-
new_post.tags << saved_tag
|
463
|
-
assert new_post.new_record?
|
464
|
-
assert !saved_tag.new_record?
|
465
|
-
assert new_post.tags.include?(saved_tag)
|
466
|
-
|
467
|
-
new_post.save!
|
468
|
-
assert !new_post.new_record?
|
469
|
-
assert new_post.reload.tags(true).include?(saved_tag)
|
470
|
-
|
471
|
-
assert posts(:thinking).tags.build.new_record?
|
472
|
-
assert posts(:thinking).tags.new.new_record?
|
473
|
-
end
|
474
|
-
|
475
|
-
def test_create_associate_when_adding_to_has_many_through
|
476
|
-
count = posts(:thinking).tags.count
|
477
|
-
push = Tag.create!(:name => 'pushme')
|
478
|
-
post_thinking = posts(:thinking)
|
479
|
-
assert_nothing_raised { post_thinking.tags << push }
|
480
|
-
assert_nil( wrong = post_thinking.tags.detect { |t| t.class != Tag },
|
481
|
-
message = "Expected a Tag in tags collection, got #{wrong.class}.")
|
482
|
-
assert_nil( wrong = post_thinking.taggings.detect { |t| t.class != Tagging },
|
483
|
-
message = "Expected a Tagging in taggings collection, got #{wrong.class}.")
|
484
|
-
assert_equal(count + 1, post_thinking.tags.size)
|
485
|
-
assert_equal(count + 1, post_thinking.tags(true).size)
|
486
|
-
|
487
|
-
assert_kind_of Tag, post_thinking.tags.create!(:name => 'foo')
|
488
|
-
assert_nil( wrong = post_thinking.tags.detect { |t| t.class != Tag },
|
489
|
-
message = "Expected a Tag in tags collection, got #{wrong.class}.")
|
490
|
-
assert_nil( wrong = post_thinking.taggings.detect { |t| t.class != Tagging },
|
491
|
-
message = "Expected a Tagging in taggings collection, got #{wrong.class}.")
|
492
|
-
assert_equal(count + 2, post_thinking.tags.size)
|
493
|
-
assert_equal(count + 2, post_thinking.tags(true).size)
|
494
|
-
|
495
|
-
assert_nothing_raised { post_thinking.tags.concat(Tag.create!(:name => 'abc'), Tag.create!(:name => 'def')) }
|
496
|
-
assert_nil( wrong = post_thinking.tags.detect { |t| t.class != Tag },
|
497
|
-
message = "Expected a Tag in tags collection, got #{wrong.class}.")
|
498
|
-
assert_nil( wrong = post_thinking.taggings.detect { |t| t.class != Tagging },
|
499
|
-
message = "Expected a Tagging in taggings collection, got #{wrong.class}.")
|
500
|
-
assert_equal(count + 4, post_thinking.tags.size)
|
501
|
-
assert_equal(count + 4, post_thinking.tags(true).size)
|
502
|
-
|
503
|
-
# Raises if the wrong reflection name is used to set the Edge belongs_to
|
504
|
-
assert_nothing_raised { vertices(:vertex_1).sinks << vertices(:vertex_5) }
|
505
|
-
end
|
506
|
-
|
507
|
-
def test_has_many_through_collection_size_doesnt_load_target_if_not_loaded
|
508
|
-
author = authors(:david)
|
509
|
-
assert_equal 9, author.comments.size
|
510
|
-
assert !author.comments.loaded?
|
511
|
-
end
|
512
|
-
|
513
|
-
def test_has_many_through_collection_size_uses_counter_cache_if_it_exists
|
514
|
-
author = authors(:david)
|
515
|
-
author.stubs(:read_attribute).with('comments_count').returns(100)
|
516
|
-
assert_equal 100, author.comments.size
|
517
|
-
assert !author.comments.loaded?
|
518
|
-
end
|
519
|
-
|
520
|
-
def test_adding_junk_to_has_many_through_should_raise_type_mismatch
|
521
|
-
assert_raise(ActiveRecord::AssociationTypeMismatch) { posts(:thinking).tags << "Uhh what now?" }
|
522
|
-
end
|
523
|
-
|
524
|
-
def test_adding_to_has_many_through_should_return_self
|
525
|
-
tags = posts(:thinking).tags
|
526
|
-
assert_equal tags, posts(:thinking).tags.push(tags(:general))
|
527
|
-
end
|
528
|
-
|
529
|
-
def test_delete_associate_when_deleting_from_has_many_through_with_nonstandard_id
|
530
|
-
count = books(:awdr).references.count
|
531
|
-
references_before = books(:awdr).references
|
532
|
-
book = Book.create!(:name => 'Getting Real')
|
533
|
-
book_awdr = books(:awdr)
|
534
|
-
book_awdr.references << book
|
535
|
-
assert_equal(count + 1, book_awdr.references(true).size)
|
536
|
-
|
537
|
-
assert_nothing_raised { book_awdr.references.delete(book) }
|
538
|
-
assert_equal(count, book_awdr.references.size)
|
539
|
-
assert_equal(count, book_awdr.references(true).size)
|
540
|
-
assert_equal(references_before.sort, book_awdr.references.sort)
|
541
|
-
end
|
542
|
-
|
543
|
-
def test_delete_associate_when_deleting_from_has_many_through
|
544
|
-
count = posts(:thinking).tags.count
|
545
|
-
tags_before = posts(:thinking).tags
|
546
|
-
tag = Tag.create!(:name => 'doomed')
|
547
|
-
post_thinking = posts(:thinking)
|
548
|
-
post_thinking.tags << tag
|
549
|
-
assert_equal(count + 1, post_thinking.taggings(true).size)
|
550
|
-
assert_equal(count + 1, post_thinking.tags(true).size)
|
551
|
-
|
552
|
-
assert_nothing_raised { post_thinking.tags.delete(tag) }
|
553
|
-
assert_equal(count, post_thinking.tags.size)
|
554
|
-
assert_equal(count, post_thinking.tags(true).size)
|
555
|
-
assert_equal(count, post_thinking.taggings(true).size)
|
556
|
-
assert_equal(tags_before.sort, post_thinking.tags.sort)
|
557
|
-
end
|
558
|
-
|
559
|
-
def test_delete_associate_when_deleting_from_has_many_through_with_multiple_tags
|
560
|
-
count = posts(:thinking).tags.count
|
561
|
-
tags_before = posts(:thinking).tags
|
562
|
-
doomed = Tag.create!(:name => 'doomed')
|
563
|
-
doomed2 = Tag.create!(:name => 'doomed2')
|
564
|
-
quaked = Tag.create!(:name => 'quaked')
|
565
|
-
post_thinking = posts(:thinking)
|
566
|
-
post_thinking.tags << doomed << doomed2
|
567
|
-
assert_equal(count + 2, post_thinking.tags(true).size)
|
568
|
-
|
569
|
-
assert_nothing_raised { post_thinking.tags.delete(doomed, doomed2, quaked) }
|
570
|
-
assert_equal(count, post_thinking.tags.size)
|
571
|
-
assert_equal(count, post_thinking.tags(true).size)
|
572
|
-
assert_equal(tags_before.sort, post_thinking.tags.sort)
|
573
|
-
end
|
574
|
-
|
575
|
-
def test_deleting_junk_from_has_many_through_should_raise_type_mismatch
|
576
|
-
assert_raise(ActiveRecord::AssociationTypeMismatch) { posts(:thinking).tags.delete("Uhh what now?") }
|
577
|
-
end
|
578
|
-
|
579
|
-
def test_has_many_through_sum_uses_calculations
|
580
|
-
assert_nothing_raised { authors(:david).comments.sum(:post_id) }
|
581
|
-
end
|
582
|
-
|
583
|
-
def test_calculations_on_has_many_through_should_disambiguate_fields
|
584
|
-
assert_nothing_raised { authors(:david).categories.maximum(:id) }
|
585
|
-
end
|
586
|
-
|
587
|
-
def test_calculations_on_has_many_through_should_not_disambiguate_fields_unless_necessary
|
588
|
-
assert_nothing_raised { authors(:david).categories.maximum("categories.id") }
|
589
|
-
end
|
590
|
-
|
591
|
-
def test_has_many_through_has_many_with_sti
|
592
|
-
assert_equal [comments(:does_it_hurt)], authors(:david).special_post_comments
|
593
|
-
end
|
594
|
-
|
595
|
-
def test_uniq_has_many_through_should_retain_order
|
596
|
-
comment_ids = authors(:david).comments.map(&:id)
|
597
|
-
assert_equal comment_ids.sort, authors(:david).ordered_uniq_comments.map(&:id)
|
598
|
-
assert_equal comment_ids.sort.reverse, authors(:david).ordered_uniq_comments_desc.map(&:id)
|
599
|
-
end
|
600
|
-
|
601
|
-
def test_polymorphic_has_many
|
602
|
-
expected = taggings(:welcome_general)
|
603
|
-
p = Post.find(posts(:welcome).id, :include => :taggings)
|
604
|
-
assert_no_queries {assert p.taggings.include?(expected)}
|
605
|
-
assert posts(:welcome).taggings.include?(taggings(:welcome_general))
|
606
|
-
end
|
607
|
-
|
608
|
-
def test_polymorphic_has_one
|
609
|
-
expected = posts(:welcome)
|
610
|
-
|
611
|
-
tagging = Tagging.find(taggings(:welcome_general).id, :include => :taggable)
|
612
|
-
assert_no_queries { assert_equal expected, tagging.taggable}
|
613
|
-
end
|
614
|
-
|
615
|
-
def test_polymorphic_belongs_to
|
616
|
-
p = Post.find(posts(:welcome).id, :include => {:taggings => :taggable})
|
617
|
-
assert_no_queries {assert_equal posts(:welcome), p.taggings.first.taggable}
|
618
|
-
end
|
619
|
-
|
620
|
-
def test_preload_polymorphic_has_many_through
|
621
|
-
posts = Post.find(:all, :order => 'posts.id')
|
622
|
-
posts_with_tags = Post.find(:all, :include => :tags, :order => 'posts.id')
|
623
|
-
assert_equal posts.length, posts_with_tags.length
|
624
|
-
posts.length.times do |i|
|
625
|
-
assert_equal posts[i].tags.length, assert_no_queries { posts_with_tags[i].tags.length }
|
626
|
-
end
|
627
|
-
end
|
628
|
-
|
629
|
-
def test_preload_polymorph_many_types
|
630
|
-
taggings = Tagging.find :all, :include => :taggable, :conditions => ['taggable_type != ?', 'FakeModel']
|
631
|
-
assert_no_queries do
|
632
|
-
taggings.first.taggable.id
|
633
|
-
taggings[1].taggable.id
|
634
|
-
end
|
635
|
-
|
636
|
-
taggables = taggings.map(&:taggable)
|
637
|
-
assert taggables.include?(items(:dvd))
|
638
|
-
assert taggables.include?(posts(:welcome))
|
639
|
-
end
|
640
|
-
|
641
|
-
def test_preload_nil_polymorphic_belongs_to
|
642
|
-
assert_nothing_raised do
|
643
|
-
taggings = Tagging.find(:all, :include => :taggable, :conditions => ['taggable_type IS NULL'])
|
644
|
-
end
|
645
|
-
end
|
646
|
-
|
647
|
-
def test_preload_polymorphic_has_many
|
648
|
-
posts = Post.find(:all, :order => 'posts.id')
|
649
|
-
posts_with_taggings = Post.find(:all, :include => :taggings, :order => 'posts.id')
|
650
|
-
assert_equal posts.length, posts_with_taggings.length
|
651
|
-
posts.length.times do |i|
|
652
|
-
assert_equal posts[i].taggings.length, assert_no_queries { posts_with_taggings[i].taggings.length }
|
653
|
-
end
|
654
|
-
end
|
655
|
-
|
656
|
-
def test_belongs_to_shared_parent
|
657
|
-
comments = Comment.find(:all, :include => :post, :conditions => 'post_id = 1')
|
658
|
-
assert_no_queries do
|
659
|
-
assert_equal comments.first.post, comments[1].post
|
660
|
-
end
|
661
|
-
end
|
662
|
-
|
663
|
-
def test_has_many_through_include_uses_array_include_after_loaded
|
664
|
-
david = authors(:david)
|
665
|
-
david.categories.class # force load target
|
666
|
-
|
667
|
-
category = david.categories.first
|
668
|
-
|
669
|
-
assert_no_queries do
|
670
|
-
assert david.categories.loaded?
|
671
|
-
assert david.categories.include?(category)
|
672
|
-
end
|
673
|
-
end
|
674
|
-
|
675
|
-
def test_has_many_through_include_checks_if_record_exists_if_target_not_loaded
|
676
|
-
david = authors(:david)
|
677
|
-
category = david.categories.first
|
678
|
-
|
679
|
-
david.reload
|
680
|
-
assert ! david.categories.loaded?
|
681
|
-
assert_queries(1) do
|
682
|
-
assert david.categories.include?(category)
|
683
|
-
end
|
684
|
-
assert ! david.categories.loaded?
|
685
|
-
end
|
686
|
-
|
687
|
-
def test_has_many_through_include_returns_false_for_non_matching_record_to_verify_scoping
|
688
|
-
david = authors(:david)
|
689
|
-
category = Category.create!(:name => 'Not Associated')
|
690
|
-
|
691
|
-
assert ! david.categories.loaded?
|
692
|
-
assert ! david.categories.include?(category)
|
693
|
-
end
|
694
|
-
|
695
|
-
def test_has_many_through_goes_through_all_sti_classes
|
696
|
-
sub_sti_post = SubStiPost.create!(:title => 'test', :body => 'test', :author_id => 1)
|
697
|
-
new_comment = sub_sti_post.comments.create(:body => 'test')
|
698
|
-
|
699
|
-
assert_equal [9, 10, new_comment.id], authors(:david).sti_post_comments.map(&:id).sort
|
700
|
-
end
|
701
|
-
|
702
|
-
private
|
703
|
-
# create dynamic Post models to allow different dependency options
|
704
|
-
def find_post_with_dependency(post_id, association, association_name, dependency)
|
705
|
-
class_name = "PostWith#{association.to_s.classify}#{dependency.to_s.classify}"
|
706
|
-
Post.find(post_id).update_attribute :type, class_name
|
707
|
-
klass = Object.const_set(class_name, Class.new(ActiveRecord::Base))
|
708
|
-
klass.set_table_name 'posts'
|
709
|
-
klass.send(association, association_name, :as => :taggable, :dependent => dependency)
|
710
|
-
klass.find(post_id)
|
711
|
-
end
|
712
|
-
end
|