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,3 +1,4 @@
|
|
1
|
+
require 'active_support/core_ext/object/blank'
|
1
2
|
require 'date'
|
2
3
|
require 'set'
|
3
4
|
require 'bigdecimal'
|
@@ -5,258 +6,7 @@ require 'bigdecimal/util'
|
|
5
6
|
|
6
7
|
module ActiveRecord
|
7
8
|
module ConnectionAdapters #:nodoc:
|
8
|
-
|
9
|
-
class Column
|
10
|
-
TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE'].to_set
|
11
|
-
FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE'].to_set
|
12
|
-
|
13
|
-
module Format
|
14
|
-
ISO_DATE = /\A(\d{4})-(\d\d)-(\d\d)\z/
|
15
|
-
ISO_DATETIME = /\A(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)(\.\d+)?\z/
|
16
|
-
end
|
17
|
-
|
18
|
-
attr_reader :name, :default, :type, :limit, :null, :sql_type, :precision, :scale
|
19
|
-
attr_accessor :primary
|
20
|
-
|
21
|
-
# Instantiates a new column in the table.
|
22
|
-
#
|
23
|
-
# +name+ is the column's name, such as <tt>supplier_id</tt> in <tt>supplier_id int(11)</tt>.
|
24
|
-
# +default+ is the type-casted default value, such as +new+ in <tt>sales_stage varchar(20) default 'new'</tt>.
|
25
|
-
# +sql_type+ is only used to extract the column's length, if necessary. For example +60+ in <tt>company_name varchar(60)</tt>.
|
26
|
-
# +null+ determines if this column allows +NULL+ values.
|
27
|
-
def initialize(name, default, sql_type = nil, null = true)
|
28
|
-
@name, @sql_type, @null = name, sql_type, null
|
29
|
-
@limit, @precision, @scale = extract_limit(sql_type), extract_precision(sql_type), extract_scale(sql_type)
|
30
|
-
@type = simplified_type(sql_type)
|
31
|
-
@default = extract_default(default)
|
32
|
-
|
33
|
-
@primary = nil
|
34
|
-
end
|
35
|
-
|
36
|
-
# Returns +true+ if the column is either of type string or text.
|
37
|
-
def text?
|
38
|
-
type == :string || type == :text
|
39
|
-
end
|
40
|
-
|
41
|
-
# Returns +true+ if the column is either of type integer, float or decimal.
|
42
|
-
def number?
|
43
|
-
type == :integer || type == :float || type == :decimal
|
44
|
-
end
|
45
|
-
|
46
|
-
def has_default?
|
47
|
-
!default.nil?
|
48
|
-
end
|
49
|
-
|
50
|
-
# Returns the Ruby class that corresponds to the abstract data type.
|
51
|
-
def klass
|
52
|
-
case type
|
53
|
-
when :integer then Fixnum
|
54
|
-
when :float then Float
|
55
|
-
when :decimal then BigDecimal
|
56
|
-
when :datetime then Time
|
57
|
-
when :date then Date
|
58
|
-
when :timestamp then Time
|
59
|
-
when :time then Time
|
60
|
-
when :text, :string then String
|
61
|
-
when :binary then String
|
62
|
-
when :boolean then Object
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
# Casts value (which is a String) to an appropriate instance.
|
67
|
-
def type_cast(value)
|
68
|
-
return nil if value.nil?
|
69
|
-
case type
|
70
|
-
when :string then value
|
71
|
-
when :text then value
|
72
|
-
when :integer then value.to_i rescue value ? 1 : 0
|
73
|
-
when :float then value.to_f
|
74
|
-
when :decimal then self.class.value_to_decimal(value)
|
75
|
-
when :datetime then self.class.string_to_time(value)
|
76
|
-
when :timestamp then self.class.string_to_time(value)
|
77
|
-
when :time then self.class.string_to_dummy_time(value)
|
78
|
-
when :date then self.class.string_to_date(value)
|
79
|
-
when :binary then self.class.binary_to_string(value)
|
80
|
-
when :boolean then self.class.value_to_boolean(value)
|
81
|
-
else value
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def type_cast_code(var_name)
|
86
|
-
case type
|
87
|
-
when :string then nil
|
88
|
-
when :text then nil
|
89
|
-
when :integer then "(#{var_name}.to_i rescue #{var_name} ? 1 : 0)"
|
90
|
-
when :float then "#{var_name}.to_f"
|
91
|
-
when :decimal then "#{self.class.name}.value_to_decimal(#{var_name})"
|
92
|
-
when :datetime then "#{self.class.name}.string_to_time(#{var_name})"
|
93
|
-
when :timestamp then "#{self.class.name}.string_to_time(#{var_name})"
|
94
|
-
when :time then "#{self.class.name}.string_to_dummy_time(#{var_name})"
|
95
|
-
when :date then "#{self.class.name}.string_to_date(#{var_name})"
|
96
|
-
when :binary then "#{self.class.name}.binary_to_string(#{var_name})"
|
97
|
-
when :boolean then "#{self.class.name}.value_to_boolean(#{var_name})"
|
98
|
-
else nil
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
# Returns the human name of the column name.
|
103
|
-
#
|
104
|
-
# ===== Examples
|
105
|
-
# Column.new('sales_stage', ...).human_name # => 'Sales stage'
|
106
|
-
def human_name
|
107
|
-
Base.human_attribute_name(@name)
|
108
|
-
end
|
109
|
-
|
110
|
-
def extract_default(default)
|
111
|
-
type_cast(default)
|
112
|
-
end
|
113
|
-
|
114
|
-
class << self
|
115
|
-
# Used to convert from Strings to BLOBs
|
116
|
-
def string_to_binary(value)
|
117
|
-
value
|
118
|
-
end
|
119
|
-
|
120
|
-
# Used to convert from BLOBs to Strings
|
121
|
-
def binary_to_string(value)
|
122
|
-
value
|
123
|
-
end
|
124
|
-
|
125
|
-
def string_to_date(string)
|
126
|
-
return string unless string.is_a?(String)
|
127
|
-
return nil if string.empty?
|
128
|
-
|
129
|
-
fast_string_to_date(string) || fallback_string_to_date(string)
|
130
|
-
end
|
131
|
-
|
132
|
-
def string_to_time(string)
|
133
|
-
return string unless string.is_a?(String)
|
134
|
-
return nil if string.empty?
|
135
|
-
|
136
|
-
fast_string_to_time(string) || fallback_string_to_time(string)
|
137
|
-
end
|
138
|
-
|
139
|
-
def string_to_dummy_time(string)
|
140
|
-
return string unless string.is_a?(String)
|
141
|
-
return nil if string.empty?
|
142
|
-
|
143
|
-
string_to_time "2000-01-01 #{string}"
|
144
|
-
end
|
145
|
-
|
146
|
-
# convert something to a boolean
|
147
|
-
def value_to_boolean(value)
|
148
|
-
if value.is_a?(String) && value.blank?
|
149
|
-
nil
|
150
|
-
else
|
151
|
-
TRUE_VALUES.include?(value)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
# convert something to a BigDecimal
|
156
|
-
def value_to_decimal(value)
|
157
|
-
# Using .class is faster than .is_a? and
|
158
|
-
# subclasses of BigDecimal will be handled
|
159
|
-
# in the else clause
|
160
|
-
if value.class == BigDecimal
|
161
|
-
value
|
162
|
-
elsif value.respond_to?(:to_d)
|
163
|
-
value.to_d
|
164
|
-
else
|
165
|
-
value.to_s.to_d
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
protected
|
170
|
-
# '0.123456' -> 123456
|
171
|
-
# '1.123456' -> 123456
|
172
|
-
def microseconds(time)
|
173
|
-
((time[:sec_fraction].to_f % 1) * 1_000_000).to_i
|
174
|
-
end
|
175
|
-
|
176
|
-
def new_date(year, mon, mday)
|
177
|
-
if year && year != 0
|
178
|
-
Date.new(year, mon, mday) rescue nil
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
def new_time(year, mon, mday, hour, min, sec, microsec)
|
183
|
-
# Treat 0000-00-00 00:00:00 as nil.
|
184
|
-
return nil if year.nil? || year == 0
|
185
|
-
|
186
|
-
Time.time_with_datetime_fallback(Base.default_timezone, year, mon, mday, hour, min, sec, microsec) rescue nil
|
187
|
-
end
|
188
|
-
|
189
|
-
def fast_string_to_date(string)
|
190
|
-
if string =~ Format::ISO_DATE
|
191
|
-
new_date $1.to_i, $2.to_i, $3.to_i
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
# Doesn't handle time zones.
|
196
|
-
def fast_string_to_time(string)
|
197
|
-
if string =~ Format::ISO_DATETIME
|
198
|
-
microsec = ($7.to_f * 1_000_000).to_i
|
199
|
-
new_time $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, microsec
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
def fallback_string_to_date(string)
|
204
|
-
new_date(*::Date._parse(string, false).values_at(:year, :mon, :mday))
|
205
|
-
end
|
206
|
-
|
207
|
-
def fallback_string_to_time(string)
|
208
|
-
time_hash = Date._parse(string)
|
209
|
-
time_hash[:sec_fraction] = microseconds(time_hash)
|
210
|
-
|
211
|
-
new_time(*time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction))
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
private
|
216
|
-
def extract_limit(sql_type)
|
217
|
-
$1.to_i if sql_type =~ /\((.*)\)/
|
218
|
-
end
|
219
|
-
|
220
|
-
def extract_precision(sql_type)
|
221
|
-
$2.to_i if sql_type =~ /^(numeric|decimal|number)\((\d+)(,\d+)?\)/i
|
222
|
-
end
|
223
|
-
|
224
|
-
def extract_scale(sql_type)
|
225
|
-
case sql_type
|
226
|
-
when /^(numeric|decimal|number)\((\d+)\)/i then 0
|
227
|
-
when /^(numeric|decimal|number)\((\d+)(,(\d+))\)/i then $4.to_i
|
228
|
-
end
|
229
|
-
end
|
230
|
-
|
231
|
-
def simplified_type(field_type)
|
232
|
-
case field_type
|
233
|
-
when /int/i
|
234
|
-
:integer
|
235
|
-
when /float|double/i
|
236
|
-
:float
|
237
|
-
when /decimal|numeric|number/i
|
238
|
-
extract_scale(field_type) == 0 ? :integer : :decimal
|
239
|
-
when /datetime/i
|
240
|
-
:datetime
|
241
|
-
when /timestamp/i
|
242
|
-
:timestamp
|
243
|
-
when /time/i
|
244
|
-
:time
|
245
|
-
when /date/i
|
246
|
-
:date
|
247
|
-
when /clob/i, /text/i
|
248
|
-
:text
|
249
|
-
when /blob/i, /binary/i
|
250
|
-
:binary
|
251
|
-
when /char/i, /string/i
|
252
|
-
:string
|
253
|
-
when /boolean/i
|
254
|
-
:boolean
|
255
|
-
end
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
class IndexDefinition < Struct.new(:table, :name, :unique, :columns, :lengths) #:nodoc:
|
9
|
+
class IndexDefinition < Struct.new(:table, :name, :unique, :columns, :lengths, :orders) #:nodoc:
|
260
10
|
end
|
261
11
|
|
262
12
|
# Abstract representation of a column definition. Instances of this type
|
@@ -265,6 +15,10 @@ module ActiveRecord
|
|
265
15
|
# for generating a number of table creation or table changing SQL statements.
|
266
16
|
class ColumnDefinition < Struct.new(:base, :name, :type, :limit, :precision, :scale, :default, :null) #:nodoc:
|
267
17
|
|
18
|
+
def string_to_binary(value)
|
19
|
+
value
|
20
|
+
end
|
21
|
+
|
268
22
|
def sql_type
|
269
23
|
base.type_to_sql(type.to_sym, limit, precision, scale) rescue type
|
270
24
|
end
|
@@ -288,17 +42,17 @@ module ActiveRecord
|
|
288
42
|
# Represents the schema of an SQL table in an abstract way. This class
|
289
43
|
# provides methods for manipulating the schema representation.
|
290
44
|
#
|
291
|
-
# Inside migration files, the +t+ object in +create_table+
|
292
|
-
#
|
45
|
+
# Inside migration files, the +t+ object in +create_table+
|
46
|
+
# is actually of this type:
|
293
47
|
#
|
294
48
|
# class SomeMigration < ActiveRecord::Migration
|
295
|
-
# def
|
49
|
+
# def up
|
296
50
|
# create_table :foo do |t|
|
297
51
|
# puts t.class # => "ActiveRecord::ConnectionAdapters::TableDefinition"
|
298
52
|
# end
|
299
53
|
# end
|
300
54
|
#
|
301
|
-
# def
|
55
|
+
# def down
|
302
56
|
# ...
|
303
57
|
# end
|
304
58
|
# end
|
@@ -312,23 +66,19 @@ module ActiveRecord
|
|
312
66
|
|
313
67
|
def initialize(base)
|
314
68
|
@columns = []
|
69
|
+
@columns_hash = {}
|
315
70
|
@base = base
|
316
71
|
end
|
317
72
|
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
73
|
+
def xml(*args)
|
74
|
+
raise NotImplementedError unless %w{
|
75
|
+
sqlite mysql mysql2
|
76
|
+
}.include? @base.adapter_name.downcase
|
77
|
+
|
78
|
+
options = args.extract_options!
|
79
|
+
column(args[0], :text, options)
|
323
80
|
end
|
324
81
|
|
325
|
-
def xml_column_fallback(*args)
|
326
|
-
case @base.adapter_name.downcase
|
327
|
-
when 'sqlite', 'mysql'
|
328
|
-
options = args.extract_options!
|
329
|
-
column(args[0], :text, options)
|
330
|
-
end
|
331
|
-
end
|
332
82
|
# Appends a primary key definition to the table definition.
|
333
83
|
# Can be called multiple times, but this is probably not a good idea.
|
334
84
|
def primary_key(name)
|
@@ -337,7 +87,7 @@ module ActiveRecord
|
|
337
87
|
|
338
88
|
# Returns a ColumnDefinition for the column with name +name+.
|
339
89
|
def [](name)
|
340
|
-
@
|
90
|
+
@columns_hash[name.to_s]
|
341
91
|
end
|
342
92
|
|
343
93
|
# Instantiates a new column for the table.
|
@@ -354,7 +104,8 @@ module ActiveRecord
|
|
354
104
|
#
|
355
105
|
# Available options are (none of these exists by default):
|
356
106
|
# * <tt>:limit</tt> -
|
357
|
-
# Requests a maximum column length. This is number of characters for <tt>:string</tt> and
|
107
|
+
# Requests a maximum column length. This is number of characters for <tt>:string</tt> and
|
108
|
+
# <tt>:text</tt> columns and number of bytes for <tt>:binary</tt> and <tt>:integer</tt> columns.
|
358
109
|
# * <tt>:default</tt> -
|
359
110
|
# The column's default value. Use nil for NULL.
|
360
111
|
# * <tt>:null</tt> -
|
@@ -403,7 +154,7 @@ module ActiveRecord
|
|
403
154
|
# This method returns <tt>self</tt>.
|
404
155
|
#
|
405
156
|
# == Examples
|
406
|
-
# # Assuming td is an instance of TableDefinition
|
157
|
+
# # Assuming +td+ is an instance of TableDefinition
|
407
158
|
# td.column(:granted, :boolean)
|
408
159
|
# # granted BOOLEAN
|
409
160
|
#
|
@@ -454,11 +205,11 @@ module ActiveRecord
|
|
454
205
|
# end
|
455
206
|
#
|
456
207
|
# There's a short-hand method for each of the type values declared at the top. And then there's
|
457
|
-
# TableDefinition#timestamps that'll add created_at and +updated_at+ as datetimes.
|
208
|
+
# TableDefinition#timestamps that'll add +created_at+ and +updated_at+ as datetimes.
|
458
209
|
#
|
459
210
|
# TableDefinition#references will add an appropriately-named _id column, plus a corresponding _type
|
460
|
-
# column if the <tt>:polymorphic</tt> option is supplied. If <tt>:polymorphic</tt> is a hash of
|
461
|
-
# used when creating the <tt>_type</tt> column. So what can be written like this:
|
211
|
+
# column if the <tt>:polymorphic</tt> option is supplied. If <tt>:polymorphic</tt> is a hash of
|
212
|
+
# options, these will be used when creating the <tt>_type</tt> column. So what can be written like this:
|
462
213
|
#
|
463
214
|
# create_table :taggings do |t|
|
464
215
|
# t.integer :tag_id, :tagger_id, :taggable_id
|
@@ -474,35 +225,38 @@ module ActiveRecord
|
|
474
225
|
# t.references :taggable, :polymorphic => { :default => 'Photo' }
|
475
226
|
# end
|
476
227
|
def column(name, type, options = {})
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
228
|
+
name = name.to_s
|
229
|
+
type = type.to_sym
|
230
|
+
|
231
|
+
column = self[name] || new_column_definition(@base, name, type)
|
232
|
+
|
233
|
+
limit = options.fetch(:limit) do
|
234
|
+
native[type][:limit] if native[type].is_a?(Hash)
|
482
235
|
end
|
236
|
+
|
237
|
+
column.limit = limit
|
483
238
|
column.precision = options[:precision]
|
484
|
-
column.scale
|
485
|
-
column.default
|
486
|
-
column.null
|
487
|
-
@columns << column unless @columns.include? column
|
239
|
+
column.scale = options[:scale]
|
240
|
+
column.default = options[:default]
|
241
|
+
column.null = options[:null]
|
488
242
|
self
|
489
243
|
end
|
490
244
|
|
491
245
|
%w( string text integer float decimal datetime timestamp time date binary boolean ).each do |column_type|
|
492
|
-
class_eval <<-EOV
|
493
|
-
def #{column_type}(*args)
|
494
|
-
options = args.extract_options!
|
495
|
-
column_names = args
|
496
|
-
|
497
|
-
column_names.each { |name| column(name,
|
498
|
-
end
|
246
|
+
class_eval <<-EOV, __FILE__, __LINE__ + 1
|
247
|
+
def #{column_type}(*args) # def string(*args)
|
248
|
+
options = args.extract_options! # options = args.extract_options!
|
249
|
+
column_names = args # column_names = args
|
250
|
+
type = :'#{column_type}' # type = :string
|
251
|
+
column_names.each { |name| column(name, type, options) } # column_names.each { |name| column(name, type, options) }
|
252
|
+
end # end
|
499
253
|
EOV
|
500
254
|
end
|
501
255
|
|
502
256
|
# Appends <tt>:datetime</tt> columns <tt>:created_at</tt> and
|
503
257
|
# <tt>:updated_at</tt> to the table.
|
504
258
|
def timestamps(*args)
|
505
|
-
options = args.extract_options!
|
259
|
+
options = { :null => false }.merge(args.extract_options!)
|
506
260
|
column(:created_at, :datetime, options)
|
507
261
|
column(:updated_at, :datetime, options)
|
508
262
|
end
|
@@ -521,16 +275,23 @@ module ActiveRecord
|
|
521
275
|
# concatenated together. This string can then be prepended and appended to
|
522
276
|
# to generate the final SQL to create the table.
|
523
277
|
def to_sql
|
524
|
-
@columns.map
|
278
|
+
@columns.map { |c| c.to_sql } * ', '
|
525
279
|
end
|
526
280
|
|
527
281
|
private
|
528
|
-
|
529
|
-
|
530
|
-
|
282
|
+
def new_column_definition(base, name, type)
|
283
|
+
definition = ColumnDefinition.new base, name, type
|
284
|
+
@columns << definition
|
285
|
+
@columns_hash[name] = definition
|
286
|
+
definition
|
287
|
+
end
|
288
|
+
|
289
|
+
def native
|
290
|
+
@base.native_database_types
|
291
|
+
end
|
531
292
|
end
|
532
293
|
|
533
|
-
# Represents
|
294
|
+
# Represents an SQL table in an abstract way for updating a table.
|
534
295
|
# Also see TableDefinition and SchemaStatements#create_table
|
535
296
|
#
|
536
297
|
# Available transformations are:
|
@@ -577,6 +338,11 @@ module ActiveRecord
|
|
577
338
|
@base.add_column(@table_name, column_name, type, options)
|
578
339
|
end
|
579
340
|
|
341
|
+
# Checks to see if a column exists. See SchemaStatements#column_exists?
|
342
|
+
def column_exists?(column_name, type = nil, options = {})
|
343
|
+
@base.column_exists?(@table_name, column_name, type, options)
|
344
|
+
end
|
345
|
+
|
580
346
|
# Adds a new index to the table. +column_name+ can be a single Symbol, or
|
581
347
|
# an Array of Symbols. See SchemaStatements#add_index
|
582
348
|
#
|
@@ -591,7 +357,12 @@ module ActiveRecord
|
|
591
357
|
@base.add_index(@table_name, column_name, options)
|
592
358
|
end
|
593
359
|
|
594
|
-
#
|
360
|
+
# Checks to see if an index exists. See SchemaStatements#index_exists?
|
361
|
+
def index_exists?(column_name, options = {})
|
362
|
+
@base.index_exists?(@table_name, column_name, options)
|
363
|
+
end
|
364
|
+
|
365
|
+
# Adds timestamps (+created_at+ and +updated_at+) columns to the table. See SchemaStatements#add_timestamps
|
595
366
|
# ===== Example
|
596
367
|
# t.timestamps
|
597
368
|
def timestamps
|
@@ -620,25 +391,25 @@ module ActiveRecord
|
|
620
391
|
# t.remove(:qualification)
|
621
392
|
# t.remove(:qualification, :experience)
|
622
393
|
def remove(*column_names)
|
623
|
-
@base.remove_column(@table_name, column_names)
|
394
|
+
@base.remove_column(@table_name, *column_names)
|
624
395
|
end
|
625
396
|
|
626
397
|
# Removes the given index from the table.
|
627
398
|
#
|
628
399
|
# ===== Examples
|
629
|
-
# ====== Remove the
|
630
|
-
# t.remove_index :
|
631
|
-
# ====== Remove the index named
|
400
|
+
# ====== Remove the index_table_name_on_column in the table_name table
|
401
|
+
# t.remove_index :column
|
402
|
+
# ====== Remove the index named index_table_name_on_branch_id in the table_name table
|
632
403
|
# t.remove_index :column => :branch_id
|
633
|
-
# ====== Remove the index named
|
404
|
+
# ====== Remove the index named index_table_name_on_branch_id_and_party_id in the table_name table
|
634
405
|
# t.remove_index :column => [:branch_id, :party_id]
|
635
|
-
# ====== Remove the index named by_branch_party in the
|
406
|
+
# ====== Remove the index named by_branch_party in the table_name table
|
636
407
|
# t.remove_index :name => :by_branch_party
|
637
408
|
def remove_index(options = {})
|
638
409
|
@base.remove_index(@table_name, options)
|
639
410
|
end
|
640
411
|
|
641
|
-
# Removes the timestamp columns (created_at and updated_at) from the table.
|
412
|
+
# Removes the timestamp columns (+created_at+ and +updated_at+) from the table.
|
642
413
|
# ===== Example
|
643
414
|
# t.remove_timestamps
|
644
415
|
def remove_timestamps
|
@@ -652,7 +423,7 @@ module ActiveRecord
|
|
652
423
|
@base.rename_column(@table_name, column_name, new_column_name)
|
653
424
|
end
|
654
425
|
|
655
|
-
# Adds a reference. Optionally adds a +type+ column.
|
426
|
+
# Adds a reference. Optionally adds a +type+ column, if <tt>:polymorphic</tt> option is provided.
|
656
427
|
# <tt>references</tt> and <tt>belongs_to</tt> are acceptable.
|
657
428
|
# ===== Examples
|
658
429
|
# t.references(:goat)
|
@@ -689,17 +460,17 @@ module ActiveRecord
|
|
689
460
|
# t.string(:goat)
|
690
461
|
# t.string(:goat, :sheep)
|
691
462
|
%w( string text integer float decimal datetime timestamp time date binary boolean ).each do |column_type|
|
692
|
-
class_eval <<-EOV
|
463
|
+
class_eval <<-EOV, __FILE__, __LINE__ + 1
|
693
464
|
def #{column_type}(*args) # def string(*args)
|
694
465
|
options = args.extract_options! # options = args.extract_options!
|
695
466
|
column_names = args # column_names = args
|
696
|
-
|
467
|
+
type = :'#{column_type}' # type = :string
|
697
468
|
column_names.each do |name| # column_names.each do |name|
|
698
|
-
column = ColumnDefinition.new(@base, name,
|
469
|
+
column = ColumnDefinition.new(@base, name.to_s, type) # column = ColumnDefinition.new(@base, name, type)
|
699
470
|
if options[:limit] # if options[:limit]
|
700
471
|
column.limit = options[:limit] # column.limit = options[:limit]
|
701
|
-
elsif native[
|
702
|
-
column.limit = native[
|
472
|
+
elsif native[type].is_a?(Hash) # elsif native[type].is_a?(Hash)
|
473
|
+
column.limit = native[type][:limit] # column.limit = native[type][:limit]
|
703
474
|
end # end
|
704
475
|
column.precision = options[:precision] # column.precision = options[:precision]
|
705
476
|
column.scale = options[:scale] # column.scale = options[:scale]
|
@@ -719,4 +490,3 @@ module ActiveRecord
|
|
719
490
|
|
720
491
|
end
|
721
492
|
end
|
722
|
-
|