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
data/lib/active_record/dirty.rb
DELETED
@@ -1,183 +0,0 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
# Track unsaved attribute changes.
|
3
|
-
#
|
4
|
-
# A newly instantiated object is unchanged:
|
5
|
-
# person = Person.find_by_name('uncle bob')
|
6
|
-
# person.changed? # => false
|
7
|
-
#
|
8
|
-
# Change the name:
|
9
|
-
# person.name = 'Bob'
|
10
|
-
# person.changed? # => true
|
11
|
-
# person.name_changed? # => true
|
12
|
-
# person.name_was # => 'uncle bob'
|
13
|
-
# person.name_change # => ['uncle bob', 'Bob']
|
14
|
-
# person.name = 'Bill'
|
15
|
-
# person.name_change # => ['uncle bob', 'Bill']
|
16
|
-
#
|
17
|
-
# Save the changes:
|
18
|
-
# person.save
|
19
|
-
# person.changed? # => false
|
20
|
-
# person.name_changed? # => false
|
21
|
-
#
|
22
|
-
# Assigning the same value leaves the attribute unchanged:
|
23
|
-
# person.name = 'Bill'
|
24
|
-
# person.name_changed? # => false
|
25
|
-
# person.name_change # => nil
|
26
|
-
#
|
27
|
-
# Which attributes have changed?
|
28
|
-
# person.name = 'bob'
|
29
|
-
# person.changed # => ['name']
|
30
|
-
# person.changes # => { 'name' => ['Bill', 'bob'] }
|
31
|
-
#
|
32
|
-
# Before modifying an attribute in-place:
|
33
|
-
# person.name_will_change!
|
34
|
-
# person.name << 'by'
|
35
|
-
# person.name_change # => ['uncle bob', 'uncle bobby']
|
36
|
-
module Dirty
|
37
|
-
DIRTY_SUFFIXES = ['_changed?', '_change', '_will_change!', '_was']
|
38
|
-
|
39
|
-
def self.included(base)
|
40
|
-
base.attribute_method_suffix *DIRTY_SUFFIXES
|
41
|
-
base.alias_method_chain :write_attribute, :dirty
|
42
|
-
base.alias_method_chain :save, :dirty
|
43
|
-
base.alias_method_chain :save!, :dirty
|
44
|
-
base.alias_method_chain :update, :dirty
|
45
|
-
base.alias_method_chain :reload, :dirty
|
46
|
-
|
47
|
-
base.class_attribute :partial_updates
|
48
|
-
base.partial_updates = true
|
49
|
-
|
50
|
-
base.send(:extend, ClassMethods)
|
51
|
-
end
|
52
|
-
|
53
|
-
# Do any attributes have unsaved changes?
|
54
|
-
# person.changed? # => false
|
55
|
-
# person.name = 'bob'
|
56
|
-
# person.changed? # => true
|
57
|
-
def changed?
|
58
|
-
!changed_attributes.empty?
|
59
|
-
end
|
60
|
-
|
61
|
-
# List of attributes with unsaved changes.
|
62
|
-
# person.changed # => []
|
63
|
-
# person.name = 'bob'
|
64
|
-
# person.changed # => ['name']
|
65
|
-
def changed
|
66
|
-
changed_attributes.keys
|
67
|
-
end
|
68
|
-
|
69
|
-
# Map of changed attrs => [original value, new value].
|
70
|
-
# person.changes # => {}
|
71
|
-
# person.name = 'bob'
|
72
|
-
# person.changes # => { 'name' => ['bill', 'bob'] }
|
73
|
-
def changes
|
74
|
-
changed.inject({}) { |h, attr| h[attr] = attribute_change(attr); h }
|
75
|
-
end
|
76
|
-
|
77
|
-
# Attempts to +save+ the record and clears changed attributes if successful.
|
78
|
-
def save_with_dirty(*args) #:nodoc:
|
79
|
-
if status = save_without_dirty(*args)
|
80
|
-
changed_attributes.clear
|
81
|
-
end
|
82
|
-
status
|
83
|
-
end
|
84
|
-
|
85
|
-
# Attempts to <tt>save!</tt> the record and clears changed attributes if successful.
|
86
|
-
def save_with_dirty!(*args) #:nodoc:
|
87
|
-
status = save_without_dirty!(*args)
|
88
|
-
changed_attributes.clear
|
89
|
-
status
|
90
|
-
end
|
91
|
-
|
92
|
-
# <tt>reload</tt> the record and clears changed attributes.
|
93
|
-
def reload_with_dirty(*args) #:nodoc:
|
94
|
-
record = reload_without_dirty(*args)
|
95
|
-
changed_attributes.clear
|
96
|
-
record
|
97
|
-
end
|
98
|
-
|
99
|
-
private
|
100
|
-
# Map of change <tt>attr => original value</tt>.
|
101
|
-
def changed_attributes
|
102
|
-
@changed_attributes ||= {}
|
103
|
-
end
|
104
|
-
|
105
|
-
# Handle <tt>*_changed?</tt> for +method_missing+.
|
106
|
-
def attribute_changed?(attr)
|
107
|
-
changed_attributes.include?(attr)
|
108
|
-
end
|
109
|
-
|
110
|
-
# Handle <tt>*_change</tt> for +method_missing+.
|
111
|
-
def attribute_change(attr)
|
112
|
-
[changed_attributes[attr], __send__(attr)] if attribute_changed?(attr)
|
113
|
-
end
|
114
|
-
|
115
|
-
# Handle <tt>*_was</tt> for +method_missing+.
|
116
|
-
def attribute_was(attr)
|
117
|
-
attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
|
118
|
-
end
|
119
|
-
|
120
|
-
# Handle <tt>*_will_change!</tt> for +method_missing+.
|
121
|
-
def attribute_will_change!(attr)
|
122
|
-
changed_attributes[attr] = clone_attribute_value(:read_attribute, attr)
|
123
|
-
end
|
124
|
-
|
125
|
-
# Wrap write_attribute to remember original attribute value.
|
126
|
-
def write_attribute_with_dirty(attr, value)
|
127
|
-
attr = attr.to_s
|
128
|
-
|
129
|
-
# The attribute already has an unsaved change.
|
130
|
-
if changed_attributes.include?(attr)
|
131
|
-
old = changed_attributes[attr]
|
132
|
-
changed_attributes.delete(attr) unless field_changed?(attr, old, value)
|
133
|
-
else
|
134
|
-
old = clone_attribute_value(:read_attribute, attr)
|
135
|
-
changed_attributes[attr] = old if field_changed?(attr, old, value)
|
136
|
-
end
|
137
|
-
|
138
|
-
# Carry on.
|
139
|
-
write_attribute_without_dirty(attr, value)
|
140
|
-
end
|
141
|
-
|
142
|
-
def update_with_dirty
|
143
|
-
if partial_updates?
|
144
|
-
# Serialized attributes should always be written in case they've been
|
145
|
-
# changed in place.
|
146
|
-
update_without_dirty(changed | (attributes.keys & self.class.serialized_attributes.keys))
|
147
|
-
else
|
148
|
-
update_without_dirty
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
def field_changed?(attr, old, value)
|
153
|
-
if column = column_for_attribute(attr)
|
154
|
-
if column.number? && column.null && (old.nil? || old == 0) && value.blank?
|
155
|
-
# For nullable numeric columns, NULL gets stored in database for blank (i.e. '') values.
|
156
|
-
# Hence we don't record it as a change if the value changes from nil to ''.
|
157
|
-
# If an old value of 0 is set to '' we want this to get changed to nil as otherwise it'll
|
158
|
-
# be typecast back to 0 (''.to_i => 0)
|
159
|
-
value = nil
|
160
|
-
else
|
161
|
-
value = column.type_cast(value)
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
old != value
|
166
|
-
end
|
167
|
-
|
168
|
-
module ClassMethods
|
169
|
-
def self.extended(base)
|
170
|
-
base.singleton_class.alias_method_chain(:alias_attribute, :dirty)
|
171
|
-
end
|
172
|
-
|
173
|
-
def alias_attribute_with_dirty(new_name, old_name)
|
174
|
-
alias_attribute_without_dirty(new_name, old_name)
|
175
|
-
DIRTY_SUFFIXES.each do |suffix|
|
176
|
-
module_eval <<-STR, __FILE__, __LINE__ + 1
|
177
|
-
def #{new_name}#{suffix}; self.#{old_name}#{suffix}; end # def subject_changed?; self.title_changed?; end
|
178
|
-
STR
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|
@@ -1,197 +0,0 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module NamedScope
|
3
|
-
# All subclasses of ActiveRecord::Base have one named scope:
|
4
|
-
# * <tt>scoped</tt> - which allows for the creation of anonymous \scopes, on the fly: <tt>Shirt.scoped(:conditions => {:color => 'red'}).scoped(:include => :washing_instructions)</tt>
|
5
|
-
#
|
6
|
-
# These anonymous \scopes tend to be useful when procedurally generating complex queries, where passing
|
7
|
-
# intermediate values (scopes) around as first-class objects is convenient.
|
8
|
-
#
|
9
|
-
# You can define a scope that applies to all finders using ActiveRecord::Base.default_scope.
|
10
|
-
def self.included(base)
|
11
|
-
base.extend ClassMethods
|
12
|
-
end
|
13
|
-
|
14
|
-
module ClassMethods
|
15
|
-
def scopes
|
16
|
-
read_inheritable_attribute(:scopes) || write_inheritable_attribute(:scopes, {})
|
17
|
-
end
|
18
|
-
|
19
|
-
def scoped(scope, &block)
|
20
|
-
Scope.new(self, scope, &block)
|
21
|
-
end
|
22
|
-
|
23
|
-
# Adds a class method for retrieving and querying objects. A scope represents a narrowing of a database query,
|
24
|
-
# such as <tt>:conditions => {:color => :red}, :select => 'shirts.*', :include => :washing_instructions</tt>.
|
25
|
-
#
|
26
|
-
# class Shirt < ActiveRecord::Base
|
27
|
-
# named_scope :red, :conditions => {:color => 'red'}
|
28
|
-
# named_scope :dry_clean_only, :joins => :washing_instructions, :conditions => ['washing_instructions.dry_clean_only = ?', true]
|
29
|
-
# end
|
30
|
-
#
|
31
|
-
# The above calls to <tt>named_scope</tt> define class methods Shirt.red and Shirt.dry_clean_only. Shirt.red,
|
32
|
-
# in effect, represents the query <tt>Shirt.find(:all, :conditions => {:color => 'red'})</tt>.
|
33
|
-
#
|
34
|
-
# Unlike <tt>Shirt.find(...)</tt>, however, the object returned by Shirt.red is not an Array; it resembles the association object
|
35
|
-
# constructed by a <tt>has_many</tt> declaration. For instance, you can invoke <tt>Shirt.red.find(:first)</tt>, <tt>Shirt.red.count</tt>,
|
36
|
-
# <tt>Shirt.red.find(:all, :conditions => {:size => 'small'})</tt>. Also, just
|
37
|
-
# as with the association objects, named \scopes act like an Array, implementing Enumerable; <tt>Shirt.red.each(&block)</tt>,
|
38
|
-
# <tt>Shirt.red.first</tt>, and <tt>Shirt.red.inject(memo, &block)</tt> all behave as if Shirt.red really was an Array.
|
39
|
-
#
|
40
|
-
# These named \scopes are composable. For instance, <tt>Shirt.red.dry_clean_only</tt> will produce all shirts that are both red and dry clean only.
|
41
|
-
# Nested finds and calculations also work with these compositions: <tt>Shirt.red.dry_clean_only.count</tt> returns the number of garments
|
42
|
-
# for which these criteria obtain. Similarly with <tt>Shirt.red.dry_clean_only.average(:thread_count)</tt>.
|
43
|
-
#
|
44
|
-
# All \scopes are available as class methods on the ActiveRecord::Base descendant upon which the \scopes were defined. But they are also available to
|
45
|
-
# <tt>has_many</tt> associations. If,
|
46
|
-
#
|
47
|
-
# class Person < ActiveRecord::Base
|
48
|
-
# has_many :shirts
|
49
|
-
# end
|
50
|
-
#
|
51
|
-
# then <tt>elton.shirts.red.dry_clean_only</tt> will return all of Elton's red, dry clean
|
52
|
-
# only shirts.
|
53
|
-
#
|
54
|
-
# Named \scopes can also be procedural:
|
55
|
-
#
|
56
|
-
# class Shirt < ActiveRecord::Base
|
57
|
-
# named_scope :colored, lambda { |color|
|
58
|
-
# { :conditions => { :color => color } }
|
59
|
-
# }
|
60
|
-
# end
|
61
|
-
#
|
62
|
-
# In this example, <tt>Shirt.colored('puce')</tt> finds all puce shirts.
|
63
|
-
#
|
64
|
-
# Named \scopes can also have extensions, just as with <tt>has_many</tt> declarations:
|
65
|
-
#
|
66
|
-
# class Shirt < ActiveRecord::Base
|
67
|
-
# named_scope :red, :conditions => {:color => 'red'} do
|
68
|
-
# def dom_id
|
69
|
-
# 'red_shirts'
|
70
|
-
# end
|
71
|
-
# end
|
72
|
-
# end
|
73
|
-
#
|
74
|
-
#
|
75
|
-
# For testing complex named \scopes, you can examine the scoping options using the
|
76
|
-
# <tt>proxy_options</tt> method on the proxy itself.
|
77
|
-
#
|
78
|
-
# class Shirt < ActiveRecord::Base
|
79
|
-
# named_scope :colored, lambda { |color|
|
80
|
-
# { :conditions => { :color => color } }
|
81
|
-
# }
|
82
|
-
# end
|
83
|
-
#
|
84
|
-
# expected_options = { :conditions => { :colored => 'red' } }
|
85
|
-
# assert_equal expected_options, Shirt.colored('red').proxy_options
|
86
|
-
def named_scope(name, options = {}, &block)
|
87
|
-
name = name.to_sym
|
88
|
-
|
89
|
-
scopes[name] = lambda do |parent_scope, *args|
|
90
|
-
Scope.new(parent_scope, case options
|
91
|
-
when Hash
|
92
|
-
options
|
93
|
-
when Proc
|
94
|
-
if self.model_name != parent_scope.model_name
|
95
|
-
options.bind(parent_scope).call(*args)
|
96
|
-
else
|
97
|
-
options.call(*args)
|
98
|
-
end
|
99
|
-
end, &block)
|
100
|
-
end
|
101
|
-
|
102
|
-
singleton_class.send :define_method, name do |*args|
|
103
|
-
scopes[name].call(self, *args)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
class Scope
|
109
|
-
attr_reader :proxy_scope, :proxy_options, :current_scoped_methods_when_defined
|
110
|
-
NON_DELEGATE_METHODS = %w(nil? send object_id class extend find size count sum average maximum minimum paginate first last empty? any? respond_to?).to_set
|
111
|
-
[].methods.each do |m|
|
112
|
-
unless m =~ /^__/ || NON_DELEGATE_METHODS.include?(m.to_s)
|
113
|
-
delegate m, :to => :proxy_found
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
delegate :scopes, :with_scope, :scoped_methods, :to => :proxy_scope
|
118
|
-
|
119
|
-
def initialize(proxy_scope, options, &block)
|
120
|
-
options ||= {}
|
121
|
-
[options[:extend]].flatten.each { |extension| extend extension } if options[:extend]
|
122
|
-
extend Module.new(&block) if block_given?
|
123
|
-
unless (Scope === proxy_scope || ActiveRecord::Associations::AssociationCollection === proxy_scope)
|
124
|
-
@current_scoped_methods_when_defined = proxy_scope.send(:current_scoped_methods)
|
125
|
-
end
|
126
|
-
@proxy_scope, @proxy_options = proxy_scope, options.except(:extend)
|
127
|
-
end
|
128
|
-
|
129
|
-
def reload
|
130
|
-
load_found; self
|
131
|
-
end
|
132
|
-
|
133
|
-
def first(*args)
|
134
|
-
if args.first.kind_of?(Integer) || (@found && !args.first.kind_of?(Hash))
|
135
|
-
proxy_found.first(*args)
|
136
|
-
else
|
137
|
-
find(:first, *args)
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
def last(*args)
|
142
|
-
if args.first.kind_of?(Integer) || (@found && !args.first.kind_of?(Hash))
|
143
|
-
proxy_found.last(*args)
|
144
|
-
else
|
145
|
-
find(:last, *args)
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
def size
|
150
|
-
@found ? @found.length : count
|
151
|
-
end
|
152
|
-
|
153
|
-
def empty?
|
154
|
-
@found ? @found.empty? : count.zero?
|
155
|
-
end
|
156
|
-
|
157
|
-
def respond_to?(method, include_private = false)
|
158
|
-
super || @proxy_scope.respond_to?(method, include_private)
|
159
|
-
end
|
160
|
-
|
161
|
-
def any?
|
162
|
-
if block_given?
|
163
|
-
proxy_found.any? { |*block_args| yield(*block_args) }
|
164
|
-
else
|
165
|
-
!empty?
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
protected
|
170
|
-
def proxy_found
|
171
|
-
@found || load_found
|
172
|
-
end
|
173
|
-
|
174
|
-
private
|
175
|
-
def method_missing(method, *args, &block)
|
176
|
-
if scopes.include?(method)
|
177
|
-
scopes[method].call(self, *args)
|
178
|
-
else
|
179
|
-
with_scope({:find => proxy_options, :create => proxy_options[:conditions].is_a?(Hash) ? proxy_options[:conditions] : {}}, :reverse_merge) do
|
180
|
-
method = :new if method == :build
|
181
|
-
if current_scoped_methods_when_defined && !scoped_methods.include?(current_scoped_methods_when_defined)
|
182
|
-
with_scope current_scoped_methods_when_defined do
|
183
|
-
proxy_scope.send(method, *args, &block)
|
184
|
-
end
|
185
|
-
else
|
186
|
-
proxy_scope.send(method, *args, &block)
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
def load_found
|
193
|
-
@found = find(:all)
|
194
|
-
end
|
195
|
-
end
|
196
|
-
end
|
197
|
-
end
|
@@ -1,91 +0,0 @@
|
|
1
|
-
require 'active_support/json'
|
2
|
-
require 'active_support/core_ext/module/model_naming'
|
3
|
-
|
4
|
-
module ActiveRecord #:nodoc:
|
5
|
-
module Serialization
|
6
|
-
def self.included(base)
|
7
|
-
base.cattr_accessor :include_root_in_json, :instance_writer => false
|
8
|
-
end
|
9
|
-
|
10
|
-
# Returns a JSON string representing the model. Some configuration is
|
11
|
-
# available through +options+.
|
12
|
-
#
|
13
|
-
# The option <tt>ActiveRecord::Base.include_root_in_json</tt> controls the
|
14
|
-
# top-level behavior of to_json. In a new Rails application, it is set to
|
15
|
-
# <tt>true</tt> in initializers/new_rails_defaults.rb. When it is <tt>true</tt>,
|
16
|
-
# to_json will emit a single root node named after the object's type. For example:
|
17
|
-
#
|
18
|
-
# konata = User.find(1)
|
19
|
-
# ActiveRecord::Base.include_root_in_json = true
|
20
|
-
# konata.to_json
|
21
|
-
# # => { "user": {"id": 1, "name": "Konata Izumi", "age": 16,
|
22
|
-
# "created_at": "2006/08/01", "awesome": true} }
|
23
|
-
#
|
24
|
-
# ActiveRecord::Base.include_root_in_json = false
|
25
|
-
# konata.to_json
|
26
|
-
# # => {"id": 1, "name": "Konata Izumi", "age": 16,
|
27
|
-
# "created_at": "2006/08/01", "awesome": true}
|
28
|
-
#
|
29
|
-
# The remainder of the examples in this section assume include_root_in_json is set to
|
30
|
-
# <tt>false</tt>.
|
31
|
-
#
|
32
|
-
# Without any +options+, the returned JSON string will include all
|
33
|
-
# the model's attributes. For example:
|
34
|
-
#
|
35
|
-
# konata = User.find(1)
|
36
|
-
# konata.to_json
|
37
|
-
# # => {"id": 1, "name": "Konata Izumi", "age": 16,
|
38
|
-
# "created_at": "2006/08/01", "awesome": true}
|
39
|
-
#
|
40
|
-
# The <tt>:only</tt> and <tt>:except</tt> options can be used to limit the attributes
|
41
|
-
# included, and work similar to the +attributes+ method. For example:
|
42
|
-
#
|
43
|
-
# konata.to_json(:only => [ :id, :name ])
|
44
|
-
# # => {"id": 1, "name": "Konata Izumi"}
|
45
|
-
#
|
46
|
-
# konata.to_json(:except => [ :id, :created_at, :age ])
|
47
|
-
# # => {"name": "Konata Izumi", "awesome": true}
|
48
|
-
#
|
49
|
-
# To include any methods on the model, use <tt>:methods</tt>.
|
50
|
-
#
|
51
|
-
# konata.to_json(:methods => :permalink)
|
52
|
-
# # => {"id": 1, "name": "Konata Izumi", "age": 16,
|
53
|
-
# "created_at": "2006/08/01", "awesome": true,
|
54
|
-
# "permalink": "1-konata-izumi"}
|
55
|
-
#
|
56
|
-
# To include associations, use <tt>:include</tt>.
|
57
|
-
#
|
58
|
-
# konata.to_json(:include => :posts)
|
59
|
-
# # => {"id": 1, "name": "Konata Izumi", "age": 16,
|
60
|
-
# "created_at": "2006/08/01", "awesome": true,
|
61
|
-
# "posts": [{"id": 1, "author_id": 1, "title": "Welcome to the weblog"},
|
62
|
-
# {"id": 2, author_id: 1, "title": "So I was thinking"}]}
|
63
|
-
#
|
64
|
-
# 2nd level and higher order associations work as well:
|
65
|
-
#
|
66
|
-
# konata.to_json(:include => { :posts => {
|
67
|
-
# :include => { :comments => {
|
68
|
-
# :only => :body } },
|
69
|
-
# :only => :title } })
|
70
|
-
# # => {"id": 1, "name": "Konata Izumi", "age": 16,
|
71
|
-
# "created_at": "2006/08/01", "awesome": true,
|
72
|
-
# "posts": [{"comments": [{"body": "1st post!"}, {"body": "Second!"}],
|
73
|
-
# "title": "Welcome to the weblog"},
|
74
|
-
# {"comments": [{"body": "Don't think too hard"}],
|
75
|
-
# "title": "So I was thinking"}]}
|
76
|
-
def to_json(options = {})
|
77
|
-
super
|
78
|
-
end
|
79
|
-
|
80
|
-
def as_json(options = nil) #:nodoc:
|
81
|
-
hash = Serializer.new(self, options).serializable_record
|
82
|
-
hash = { options[:root] || self.class.model_name.element => hash } if include_root_in_json
|
83
|
-
hash
|
84
|
-
end
|
85
|
-
|
86
|
-
def from_json(json)
|
87
|
-
self.attributes = ActiveSupport::JSON.decode(json)
|
88
|
-
self
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
data/lib/activerecord.rb
DELETED
data/test/assets/example.log
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
# Logfile created on Wed Oct 31 16:05:13 +0000 2007 by logger.rb/1.5.2.9
|
data/test/assets/flowers.jpg
DELETED
Binary file
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# The filename begins with "aaa" to ensure this is the first test.
|
2
|
-
require "cases/helper"
|
3
|
-
|
4
|
-
class AAACreateTablesTest < ActiveRecord::TestCase
|
5
|
-
self.use_transactional_fixtures = false
|
6
|
-
|
7
|
-
def test_load_schema
|
8
|
-
eval(File.read(SCHEMA_ROOT + "/schema.rb"))
|
9
|
-
if File.exists?(adapter_specific_schema_file)
|
10
|
-
eval(File.read(adapter_specific_schema_file))
|
11
|
-
end
|
12
|
-
assert true
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_drop_and_create_courses_table
|
16
|
-
eval(File.read(SCHEMA_ROOT + "/schema2.rb"))
|
17
|
-
assert true
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
def adapter_specific_schema_file
|
22
|
-
SCHEMA_ROOT + '/' + ActiveRecord::Base.connection.adapter_name.downcase + '_specific_schema.rb'
|
23
|
-
end
|
24
|
-
end
|
@@ -1,122 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
|
3
|
-
class ActiveSchemaTest < ActiveRecord::TestCase
|
4
|
-
def setup
|
5
|
-
ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
|
6
|
-
alias_method :execute_without_stub, :execute
|
7
|
-
def execute(sql, name = nil) return sql end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def teardown
|
12
|
-
ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
|
13
|
-
remove_method :execute
|
14
|
-
alias_method :execute, :execute_without_stub
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_add_index
|
19
|
-
# add_index calls index_exists? which can't work since execute is stubbed
|
20
|
-
ActiveRecord::ConnectionAdapters::MysqlAdapter.send(:define_method, :index_exists?) do |*|
|
21
|
-
false
|
22
|
-
end
|
23
|
-
expected = "CREATE INDEX `index_people_on_last_name` ON `people` (`last_name`)"
|
24
|
-
assert_equal expected, add_index(:people, :last_name, :length => nil)
|
25
|
-
|
26
|
-
expected = "CREATE INDEX `index_people_on_last_name` ON `people` (`last_name`(10))"
|
27
|
-
assert_equal expected, add_index(:people, :last_name, :length => 10)
|
28
|
-
|
29
|
-
expected = "CREATE INDEX `index_people_on_last_name_and_first_name` ON `people` (`last_name`(15), `first_name`(15))"
|
30
|
-
assert_equal expected, add_index(:people, [:last_name, :first_name], :length => 15)
|
31
|
-
|
32
|
-
expected = "CREATE INDEX `index_people_on_last_name_and_first_name` ON `people` (`last_name`(15), `first_name`)"
|
33
|
-
assert_equal expected, add_index(:people, [:last_name, :first_name], :length => {:last_name => 15})
|
34
|
-
|
35
|
-
expected = "CREATE INDEX `index_people_on_last_name_and_first_name` ON `people` (`last_name`(15), `first_name`(10))"
|
36
|
-
assert_equal expected, add_index(:people, [:last_name, :first_name], :length => {:last_name => 15, :first_name => 10})
|
37
|
-
ActiveRecord::ConnectionAdapters::MysqlAdapter.send(:remove_method, :index_exists?)
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_drop_table
|
41
|
-
assert_equal "DROP TABLE `people`", drop_table(:people)
|
42
|
-
end
|
43
|
-
|
44
|
-
if current_adapter?(:MysqlAdapter)
|
45
|
-
def test_create_mysql_database_with_encoding
|
46
|
-
assert_equal "CREATE DATABASE `matt` DEFAULT CHARACTER SET `utf8`", create_database(:matt)
|
47
|
-
assert_equal "CREATE DATABASE `aimonetti` DEFAULT CHARACTER SET `latin1`", create_database(:aimonetti, {:charset => 'latin1'})
|
48
|
-
assert_equal "CREATE DATABASE `matt_aimonetti` DEFAULT CHARACTER SET `big5` COLLATE `big5_chinese_ci`", create_database(:matt_aimonetti, {:charset => :big5, :collation => :big5_chinese_ci})
|
49
|
-
end
|
50
|
-
|
51
|
-
def test_recreate_mysql_database_with_encoding
|
52
|
-
create_database(:luca, {:charset => 'latin1'})
|
53
|
-
assert_equal "CREATE DATABASE `luca` DEFAULT CHARACTER SET `latin1`", recreate_database(:luca, {:charset => 'latin1'})
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_add_column
|
58
|
-
assert_equal "ALTER TABLE `people` ADD `last_name` varchar(255)", add_column(:people, :last_name, :string)
|
59
|
-
end
|
60
|
-
|
61
|
-
def test_add_column_with_limit
|
62
|
-
assert_equal "ALTER TABLE `people` ADD `key` varchar(32)", add_column(:people, :key, :string, :limit => 32)
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_drop_table_with_specific_database
|
66
|
-
assert_equal "DROP TABLE `otherdb`.`people`", drop_table('otherdb.people')
|
67
|
-
end
|
68
|
-
|
69
|
-
def test_add_timestamps
|
70
|
-
with_real_execute do
|
71
|
-
begin
|
72
|
-
ActiveRecord::Base.connection.create_table :delete_me do |t|
|
73
|
-
end
|
74
|
-
ActiveRecord::Base.connection.add_timestamps :delete_me
|
75
|
-
assert column_present?('delete_me', 'updated_at', 'datetime')
|
76
|
-
assert column_present?('delete_me', 'created_at', 'datetime')
|
77
|
-
ensure
|
78
|
-
ActiveRecord::Base.connection.drop_table :delete_me rescue nil
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_remove_timestamps
|
84
|
-
with_real_execute do
|
85
|
-
begin
|
86
|
-
ActiveRecord::Base.connection.create_table :delete_me do |t|
|
87
|
-
t.timestamps
|
88
|
-
end
|
89
|
-
ActiveRecord::Base.connection.remove_timestamps :delete_me
|
90
|
-
assert !column_present?('delete_me', 'updated_at', 'datetime')
|
91
|
-
assert !column_present?('delete_me', 'created_at', 'datetime')
|
92
|
-
ensure
|
93
|
-
ActiveRecord::Base.connection.drop_table :delete_me rescue nil
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
private
|
99
|
-
def with_real_execute
|
100
|
-
#we need to actually modify some data, so we make execute point to the original method
|
101
|
-
ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
|
102
|
-
alias_method :execute_with_stub, :execute
|
103
|
-
alias_method :execute, :execute_without_stub
|
104
|
-
end
|
105
|
-
yield
|
106
|
-
ensure
|
107
|
-
#before finishing, we restore the alias to the mock-up method
|
108
|
-
ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
|
109
|
-
alias_method :execute, :execute_with_stub
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
|
114
|
-
def method_missing(method_symbol, *arguments)
|
115
|
-
ActiveRecord::Base.connection.send(method_symbol, *arguments)
|
116
|
-
end
|
117
|
-
|
118
|
-
def column_present?(table_name, column_name, type)
|
119
|
-
results = ActiveRecord::Base.connection.select_all("SHOW FIELDS FROM #{table_name} LIKE '#{column_name}'")
|
120
|
-
results.first && results.first['Type'] == type
|
121
|
-
end
|
122
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'cases/helper'
|
2
|
-
|
3
|
-
class PostgresqlActiveSchemaTest < Test::Unit::TestCase
|
4
|
-
def setup
|
5
|
-
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
6
|
-
alias_method :real_execute, :execute
|
7
|
-
def execute(sql, name = nil) sql end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def teardown
|
12
|
-
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send(:alias_method, :execute, :real_execute)
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_create_database_with_encoding
|
16
|
-
assert_equal %(CREATE DATABASE "matt" ENCODING = 'utf8'), create_database(:matt)
|
17
|
-
assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, :encoding => :latin1)
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
def method_missing(method_symbol, *arguments)
|
22
|
-
ActiveRecord::Base.connection.send(method_symbol, *arguments)
|
23
|
-
end
|
24
|
-
end
|