activerecord 2.3.18 → 3.0.0.beta
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.
- data/CHANGELOG +105 -34
- data/examples/performance.rb +3 -39
- data/examples/simple.rb +14 -0
- data/lib/active_record.rb +81 -47
- data/lib/active_record/aggregations.rb +1 -3
- data/lib/active_record/association_preload.rb +39 -54
- data/lib/active_record/associations.rb +262 -419
- data/lib/active_record/associations/association_collection.rb +85 -100
- data/lib/active_record/associations/association_proxy.rb +20 -18
- data/lib/active_record/associations/belongs_to_association.rb +8 -8
- data/lib/active_record/associations/has_and_belongs_to_many_association.rb +13 -35
- data/lib/active_record/associations/has_many_association.rb +11 -19
- data/lib/active_record/associations/has_many_through_association.rb +30 -183
- data/lib/active_record/associations/has_one_association.rb +10 -10
- data/lib/active_record/associations/has_one_through_association.rb +13 -11
- data/lib/active_record/associations/through_association_scope.rb +153 -0
- data/lib/active_record/attribute_methods.rb +17 -370
- data/lib/active_record/attribute_methods/before_type_cast.rb +33 -0
- data/lib/active_record/attribute_methods/dirty.rb +87 -0
- data/lib/active_record/attribute_methods/primary_key.rb +44 -0
- data/lib/active_record/attribute_methods/query.rb +37 -0
- data/lib/active_record/attribute_methods/read.rb +116 -0
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +60 -0
- data/lib/active_record/attribute_methods/write.rb +37 -0
- data/lib/active_record/autosave_association.rb +20 -41
- data/lib/active_record/base.rb +357 -1180
- data/lib/active_record/batches.rb +10 -16
- data/lib/active_record/callbacks.rb +66 -126
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +17 -13
- data/lib/active_record/connection_adapters/abstract/connection_specification.rb +5 -25
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +4 -43
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +3 -2
- data/lib/active_record/connection_adapters/abstract/quoting.rb +15 -4
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +1 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +18 -72
- data/lib/active_record/connection_adapters/abstract_adapter.rb +16 -49
- data/lib/active_record/connection_adapters/mysql_adapter.rb +15 -27
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +84 -46
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +9 -3
- data/lib/active_record/connection_adapters/sqlite_adapter.rb +34 -65
- data/lib/active_record/fixtures.rb +21 -25
- data/lib/active_record/locale/en.yml +9 -27
- data/lib/active_record/locking/optimistic.rb +16 -48
- data/lib/active_record/migration.rb +59 -46
- data/lib/active_record/named_scope.rb +85 -92
- data/lib/active_record/nested_attributes.rb +18 -24
- data/lib/active_record/observer.rb +18 -94
- data/lib/active_record/railtie.rb +83 -0
- data/lib/active_record/railties/controller_runtime.rb +38 -0
- data/lib/active_record/railties/databases.rake +477 -0
- data/lib/active_record/railties/subscriber.rb +27 -0
- data/lib/active_record/reflection.rb +2 -15
- data/lib/active_record/relation.rb +339 -0
- data/lib/active_record/relation/calculations.rb +259 -0
- data/lib/active_record/relation/finder_methods.rb +315 -0
- data/lib/active_record/relation/predicate_builder.rb +46 -0
- data/lib/active_record/relation/query_methods.rb +218 -0
- data/lib/active_record/relation/spawn_methods.rb +102 -0
- data/lib/active_record/schema_dumper.rb +10 -6
- data/lib/active_record/serialization.rb +31 -74
- data/lib/active_record/serializers/xml_serializer.rb +33 -121
- data/lib/active_record/session_store.rb +1 -9
- data/lib/active_record/test_case.rb +1 -3
- data/lib/active_record/timestamp.rb +7 -5
- data/lib/active_record/transactions.rb +9 -9
- data/lib/active_record/validations.rb +51 -1100
- data/lib/active_record/validations/associated.rb +47 -0
- data/lib/active_record/validations/uniqueness.rb +181 -0
- data/lib/active_record/version.rb +3 -3
- data/lib/generators/active_record.rb +30 -0
- data/lib/generators/active_record/migration/migration_generator.rb +25 -0
- data/lib/generators/active_record/migration/templates/migration.rb +11 -0
- data/lib/generators/active_record/model/model_generator.rb +33 -0
- data/lib/generators/active_record/model/templates/migration.rb +16 -0
- data/lib/generators/active_record/model/templates/model.rb +5 -0
- data/lib/generators/active_record/observer/observer_generator.rb +15 -0
- data/lib/generators/active_record/observer/templates/observer.rb +2 -0
- data/lib/generators/active_record/session_migration/session_migration_generator.rb +24 -0
- data/lib/generators/active_record/session_migration/templates/migration.rb +16 -0
- metadata +67 -325
- data/RUNNING_UNIT_TESTS +0 -36
- data/Rakefile +0 -268
- data/install.rb +0 -30
- data/lib/active_record/calculations.rb +0 -321
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +0 -57
- data/lib/active_record/dirty.rb +0 -183
- 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.yml +0 -14
- data/test/fixtures/categories/special_categories.yml +0 -9
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
- 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/test/cases/batches_test.rb
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
require 'cases/helper'
|
2
|
-
require 'models/post'
|
3
|
-
|
4
|
-
class EachTest < ActiveRecord::TestCase
|
5
|
-
fixtures :posts
|
6
|
-
|
7
|
-
def setup
|
8
|
-
@posts = Post.all(:order => "id asc")
|
9
|
-
@total = Post.count
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_each_should_excecute_one_query_per_batch
|
13
|
-
assert_queries(Post.count + 1) do
|
14
|
-
Post.find_each(:batch_size => 1) do |post|
|
15
|
-
assert_kind_of Post, post
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_each_should_raise_if_the_order_is_set
|
21
|
-
assert_raise(RuntimeError) do
|
22
|
-
Post.find_each(:order => "title") { |post| post }
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_each_should_raise_if_the_limit_is_set
|
27
|
-
assert_raise(RuntimeError) do
|
28
|
-
Post.find_each(:limit => 1) { |post| post }
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_find_in_batches_should_return_batches
|
33
|
-
assert_queries(Post.count + 1) do
|
34
|
-
Post.find_in_batches(:batch_size => 1) do |batch|
|
35
|
-
assert_kind_of Array, batch
|
36
|
-
assert_kind_of Post, batch.first
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_find_in_batches_should_start_from_the_start_option
|
42
|
-
assert_queries(Post.count) do
|
43
|
-
Post.find_in_batches(:batch_size => 1, :start => 2) do |batch|
|
44
|
-
assert_kind_of Array, batch
|
45
|
-
assert_kind_of Post, batch.first
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_find_in_batches_shouldnt_excute_query_unless_needed
|
51
|
-
post_count = Post.count
|
52
|
-
|
53
|
-
assert_queries(2) do
|
54
|
-
Post.find_in_batches(:batch_size => post_count) {|batch| assert_kind_of Array, batch }
|
55
|
-
end
|
56
|
-
|
57
|
-
assert_queries(1) do
|
58
|
-
Post.find_in_batches(:batch_size => post_count + 1) {|batch| assert_kind_of Array, batch }
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_find_in_batches_doesnt_clog_conditions
|
63
|
-
Post.find_in_batches(:conditions => {:id => posts(:welcome).id}) do
|
64
|
-
assert_nothing_raised { Post.find(posts(:thinking).id) }
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_each_should_raise_if_select_is_set_without_id
|
69
|
-
assert_raise(RuntimeError) do
|
70
|
-
Post.find_each(:select => :title, :batch_size => 1) { |post| post }
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_each_should_execute_if_id_is_in_select
|
75
|
-
assert_queries(4) do
|
76
|
-
Post.find_each(:select => "id, title, type", :batch_size => 2) do |post|
|
77
|
-
assert_kind_of Post, post
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
data/test/cases/binary_test.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
|
3
|
-
# Without using prepared statements, it makes no sense to test
|
4
|
-
# BLOB data with DB2 or Firebird, because the length of a statement
|
5
|
-
# is limited to 32KB.
|
6
|
-
unless current_adapter?(:SybaseAdapter, :DB2Adapter, :FirebirdAdapter)
|
7
|
-
require 'models/binary'
|
8
|
-
|
9
|
-
class BinaryTest < ActiveRecord::TestCase
|
10
|
-
FIXTURES = %w(flowers.jpg example.log)
|
11
|
-
|
12
|
-
def test_load_save
|
13
|
-
Binary.delete_all
|
14
|
-
|
15
|
-
FIXTURES.each do |filename|
|
16
|
-
data = File.read(ASSETS_ROOT + "/#{filename}")
|
17
|
-
data.force_encoding('ASCII-8BIT') if data.respond_to?(:force_encoding)
|
18
|
-
data.freeze
|
19
|
-
|
20
|
-
bin = Binary.new(:data => data)
|
21
|
-
assert_equal data, bin.data, 'Newly assigned data differs from original'
|
22
|
-
|
23
|
-
bin.save!
|
24
|
-
assert_equal data, bin.data, 'Data differs from original after save'
|
25
|
-
|
26
|
-
assert_equal data, bin.reload.data, 'Reloaded data differs from original'
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,360 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/company'
|
3
|
-
require 'models/topic'
|
4
|
-
require 'models/edge'
|
5
|
-
require 'models/owner'
|
6
|
-
require 'models/pet'
|
7
|
-
require 'models/toy'
|
8
|
-
require 'models/club'
|
9
|
-
require 'models/organization'
|
10
|
-
|
11
|
-
Company.has_many :accounts
|
12
|
-
|
13
|
-
class NumericData < ActiveRecord::Base
|
14
|
-
self.table_name = 'numeric_data'
|
15
|
-
end
|
16
|
-
|
17
|
-
class CalculationsTest < ActiveRecord::TestCase
|
18
|
-
fixtures :companies, :accounts, :topics, :owners, :pets, :toys
|
19
|
-
|
20
|
-
def test_should_sum_field
|
21
|
-
assert_equal 318, Account.sum(:credit_limit)
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_should_average_field
|
25
|
-
value = Account.average(:credit_limit)
|
26
|
-
assert_equal 53.0, value
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_should_return_nil_as_average
|
30
|
-
assert_nil NumericData.average(:bank_balance)
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_type_cast_calculated_value_should_convert_db_averages_of_fixnum_class_to_decimal
|
34
|
-
assert_equal 0, NumericData.send(:type_cast_calculated_value, 0, nil, 'avg')
|
35
|
-
assert_equal 53.0, NumericData.send(:type_cast_calculated_value, 53, nil, 'avg')
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_should_get_maximum_of_field
|
39
|
-
assert_equal 60, Account.maximum(:credit_limit)
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_should_get_maximum_of_field_with_include
|
43
|
-
assert_equal 50, Account.maximum(:credit_limit, :include => :firm, :conditions => "companies.name != 'Summit'")
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_should_get_maximum_of_field_with_scoped_include
|
47
|
-
Account.with_scope :find => { :include => :firm, :conditions => "companies.name != 'Summit'" } do
|
48
|
-
assert_equal 50, Account.maximum(:credit_limit)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_should_get_minimum_of_field
|
53
|
-
assert_equal 50, Account.minimum(:credit_limit)
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_should_group_by_field
|
57
|
-
c = Account.sum(:credit_limit, :group => :firm_id)
|
58
|
-
[1,6,2].each { |firm_id| assert c.keys.include?(firm_id) }
|
59
|
-
end
|
60
|
-
|
61
|
-
def test_should_group_by_multiple_fields
|
62
|
-
c = Account.count(:all, :group => ['firm_id', :credit_limit])
|
63
|
-
[ [nil, 50], [1, 50], [6, 50], [6, 55], [9, 53], [2, 60] ].each { |firm_and_limit| assert c.keys.include?(firm_and_limit) }
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_should_group_by_multiple_fields_having_functions
|
67
|
-
c = Topic.count(:all, :group => [:author_name, 'COALESCE(type, title)'])
|
68
|
-
assert_equal 1, c[["Nick", "The Third Topic of the day"]]
|
69
|
-
assert_equal 1, c[["Mary", "Reply"]]
|
70
|
-
assert_equal 1, c[["David", "The First Topic"]]
|
71
|
-
assert_equal 1, c[["Carl", "Reply"]]
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_should_group_by_summed_field
|
75
|
-
c = Account.sum(:credit_limit, :group => :firm_id)
|
76
|
-
assert_equal 50, c[1]
|
77
|
-
assert_equal 105, c[6]
|
78
|
-
assert_equal 60, c[2]
|
79
|
-
end
|
80
|
-
|
81
|
-
def test_should_order_by_grouped_field
|
82
|
-
c = Account.sum(:credit_limit, :group => :firm_id, :order => "firm_id")
|
83
|
-
assert_equal [1, 2, 6, 9], c.keys.compact
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_should_order_by_calculation
|
87
|
-
c = Account.sum(:credit_limit, :group => :firm_id, :order => "sum_credit_limit desc, firm_id")
|
88
|
-
assert_equal [105, 60, 53, 50, 50], c.keys.collect { |k| c[k] }
|
89
|
-
assert_equal [6, 2, 9, 1], c.keys.compact
|
90
|
-
end
|
91
|
-
|
92
|
-
def test_should_limit_calculation
|
93
|
-
c = Account.sum(:credit_limit, :conditions => "firm_id IS NOT NULL",
|
94
|
-
:group => :firm_id, :order => "firm_id", :limit => 2)
|
95
|
-
assert_equal [1, 2], c.keys.compact
|
96
|
-
end
|
97
|
-
|
98
|
-
def test_should_limit_calculation_with_offset
|
99
|
-
c = Account.sum(:credit_limit, :conditions => "firm_id IS NOT NULL",
|
100
|
-
:group => :firm_id, :order => "firm_id", :limit => 2, :offset => 1)
|
101
|
-
assert_equal [2, 6], c.keys.compact
|
102
|
-
end
|
103
|
-
|
104
|
-
def test_should_group_by_summed_field_having_condition
|
105
|
-
c = Account.sum(:credit_limit, :group => :firm_id,
|
106
|
-
:having => 'sum(credit_limit) > 50')
|
107
|
-
assert_nil c[1]
|
108
|
-
assert_equal 105, c[6]
|
109
|
-
assert_equal 60, c[2]
|
110
|
-
end
|
111
|
-
|
112
|
-
def test_should_group_by_summed_field_having_sanitized_condition
|
113
|
-
c = Account.sum(:credit_limit, :group => :firm_id,
|
114
|
-
:having => ['sum(credit_limit) > ?', 50])
|
115
|
-
assert_nil c[1]
|
116
|
-
assert_equal 105, c[6]
|
117
|
-
assert_equal 60, c[2]
|
118
|
-
end
|
119
|
-
|
120
|
-
def test_should_group_by_summed_association
|
121
|
-
c = Account.sum(:credit_limit, :group => :firm)
|
122
|
-
assert_equal 50, c[companies(:first_firm)]
|
123
|
-
assert_equal 105, c[companies(:rails_core)]
|
124
|
-
assert_equal 60, c[companies(:first_client)]
|
125
|
-
end
|
126
|
-
|
127
|
-
def test_should_sum_field_with_conditions
|
128
|
-
assert_equal 105, Account.sum(:credit_limit, :conditions => 'firm_id = 6')
|
129
|
-
end
|
130
|
-
|
131
|
-
def test_should_return_zero_if_sum_conditions_return_nothing
|
132
|
-
assert_equal 0, Account.sum(:credit_limit, :conditions => '1 = 2')
|
133
|
-
assert_equal 0, companies(:rails_core).companies.sum(:id, :conditions => '1 = 2')
|
134
|
-
end
|
135
|
-
|
136
|
-
def test_sum_should_return_valid_values_for_decimals
|
137
|
-
NumericData.create(:bank_balance => 19.83)
|
138
|
-
assert_equal 19.83, NumericData.sum(:bank_balance)
|
139
|
-
end
|
140
|
-
|
141
|
-
def test_should_group_by_summed_field_with_conditions
|
142
|
-
c = Account.sum(:credit_limit, :conditions => 'firm_id > 1',
|
143
|
-
:group => :firm_id)
|
144
|
-
assert_nil c[1]
|
145
|
-
assert_equal 105, c[6]
|
146
|
-
assert_equal 60, c[2]
|
147
|
-
end
|
148
|
-
|
149
|
-
def test_should_group_by_summed_field_with_conditions_and_having
|
150
|
-
c = Account.sum(:credit_limit, :conditions => 'firm_id > 1',
|
151
|
-
:group => :firm_id,
|
152
|
-
:having => 'sum(credit_limit) > 60')
|
153
|
-
assert_nil c[1]
|
154
|
-
assert_equal 105, c[6]
|
155
|
-
assert_nil c[2]
|
156
|
-
end
|
157
|
-
|
158
|
-
def test_should_group_by_fields_with_table_alias
|
159
|
-
c = Account.sum(:credit_limit, :group => 'accounts.firm_id')
|
160
|
-
assert_equal 50, c[1]
|
161
|
-
assert_equal 105, c[6]
|
162
|
-
assert_equal 60, c[2]
|
163
|
-
end
|
164
|
-
|
165
|
-
def test_should_calculate_with_invalid_field
|
166
|
-
assert_equal 6, Account.calculate(:count, '*')
|
167
|
-
assert_equal 6, Account.calculate(:count, :all)
|
168
|
-
end
|
169
|
-
|
170
|
-
def test_should_calculate_grouped_with_invalid_field
|
171
|
-
c = Account.count(:all, :group => 'accounts.firm_id')
|
172
|
-
assert_equal 1, c[1]
|
173
|
-
assert_equal 2, c[6]
|
174
|
-
assert_equal 1, c[2]
|
175
|
-
end
|
176
|
-
|
177
|
-
def test_should_calculate_grouped_association_with_invalid_field
|
178
|
-
c = Account.count(:all, :group => :firm)
|
179
|
-
assert_equal 1, c[companies(:first_firm)]
|
180
|
-
assert_equal 2, c[companies(:rails_core)]
|
181
|
-
assert_equal 1, c[companies(:first_client)]
|
182
|
-
end
|
183
|
-
|
184
|
-
def test_should_group_by_association_with_non_numeric_foreign_key
|
185
|
-
ActiveRecord::Base.connection.expects(:select_all).returns([{"count_all" => 1, "firm_id" => "ABC"}])
|
186
|
-
|
187
|
-
firm = mock()
|
188
|
-
firm.expects(:id).returns("ABC")
|
189
|
-
firm.expects(:class).returns(Firm)
|
190
|
-
Company.expects(:find).with(["ABC"]).returns([firm])
|
191
|
-
|
192
|
-
column = mock()
|
193
|
-
column.expects(:name).at_least_once.returns(:firm_id)
|
194
|
-
column.expects(:type_cast).with("ABC").returns("ABC")
|
195
|
-
Account.expects(:columns).at_least_once.returns([column])
|
196
|
-
|
197
|
-
c = Account.count(:all, :group => :firm)
|
198
|
-
first_key = c.keys.first
|
199
|
-
assert_equal Firm, first_key.class
|
200
|
-
assert_equal 1, c[first_key]
|
201
|
-
end
|
202
|
-
|
203
|
-
def test_should_calculate_grouped_association_with_foreign_key_option
|
204
|
-
Account.belongs_to :another_firm, :class_name => 'Firm', :foreign_key => 'firm_id'
|
205
|
-
c = Account.count(:all, :group => :another_firm)
|
206
|
-
assert_equal 1, c[companies(:first_firm)]
|
207
|
-
assert_equal 2, c[companies(:rails_core)]
|
208
|
-
assert_equal 1, c[companies(:first_client)]
|
209
|
-
end
|
210
|
-
|
211
|
-
def test_should_not_modify_options_when_using_includes
|
212
|
-
options = {:conditions => 'companies.id > 1', :include => :firm}
|
213
|
-
options_copy = options.dup
|
214
|
-
|
215
|
-
Account.count(:all, options)
|
216
|
-
assert_equal options_copy, options
|
217
|
-
end
|
218
|
-
|
219
|
-
def test_should_calculate_grouped_by_function
|
220
|
-
c = Company.count(:all, :group => "UPPER(#{QUOTED_TYPE})")
|
221
|
-
assert_equal 2, c[nil]
|
222
|
-
assert_equal 1, c['DEPENDENTFIRM']
|
223
|
-
assert_equal 3, c['CLIENT']
|
224
|
-
assert_equal 2, c['FIRM']
|
225
|
-
end
|
226
|
-
|
227
|
-
def test_should_calculate_grouped_by_function_with_table_alias
|
228
|
-
c = Company.count(:all, :group => "UPPER(companies.#{QUOTED_TYPE})")
|
229
|
-
assert_equal 2, c[nil]
|
230
|
-
assert_equal 1, c['DEPENDENTFIRM']
|
231
|
-
assert_equal 3, c['CLIENT']
|
232
|
-
assert_equal 2, c['FIRM']
|
233
|
-
end
|
234
|
-
|
235
|
-
def test_should_not_overshadow_enumerable_sum
|
236
|
-
assert_equal 6, [1, 2, 3].sum(&:abs)
|
237
|
-
end
|
238
|
-
|
239
|
-
def test_should_sum_scoped_field
|
240
|
-
assert_equal 15, companies(:rails_core).companies.sum(:id)
|
241
|
-
end
|
242
|
-
|
243
|
-
def test_should_sum_scoped_field_with_from
|
244
|
-
assert_equal Club.count, Organization.clubs.count
|
245
|
-
end
|
246
|
-
|
247
|
-
def test_should_sum_scoped_field_with_conditions
|
248
|
-
assert_equal 8, companies(:rails_core).companies.sum(:id, :conditions => 'id > 7')
|
249
|
-
end
|
250
|
-
|
251
|
-
def test_should_group_by_scoped_field
|
252
|
-
c = companies(:rails_core).companies.sum(:id, :group => :name)
|
253
|
-
assert_equal 7, c['Leetsoft']
|
254
|
-
assert_equal 8, c['Jadedpixel']
|
255
|
-
end
|
256
|
-
|
257
|
-
def test_should_group_by_summed_field_with_conditions_and_having
|
258
|
-
c = companies(:rails_core).companies.sum(:id, :group => :name,
|
259
|
-
:having => 'sum(id) > 7')
|
260
|
-
assert_nil c['Leetsoft']
|
261
|
-
assert_equal 8, c['Jadedpixel']
|
262
|
-
end
|
263
|
-
|
264
|
-
def test_should_reject_invalid_options
|
265
|
-
assert_nothing_raised do
|
266
|
-
[:count, :sum].each do |func|
|
267
|
-
# empty options are valid
|
268
|
-
Company.send(:validate_calculation_options, func)
|
269
|
-
# these options are valid for all calculations
|
270
|
-
[:select, :conditions, :joins, :order, :group, :having, :distinct].each do |opt|
|
271
|
-
Company.send(:validate_calculation_options, func, opt => true)
|
272
|
-
end
|
273
|
-
end
|
274
|
-
|
275
|
-
# :include is only valid on :count
|
276
|
-
Company.send(:validate_calculation_options, :count, :include => true)
|
277
|
-
end
|
278
|
-
|
279
|
-
assert_raise(ArgumentError) { Company.send(:validate_calculation_options, :sum, :foo => :bar) }
|
280
|
-
assert_raise(ArgumentError) { Company.send(:validate_calculation_options, :count, :foo => :bar) }
|
281
|
-
end
|
282
|
-
|
283
|
-
def test_should_count_selected_field_with_include
|
284
|
-
assert_equal 6, Account.count(:distinct => true, :include => :firm)
|
285
|
-
assert_equal 4, Account.count(:distinct => true, :include => :firm, :select => :credit_limit)
|
286
|
-
end
|
287
|
-
|
288
|
-
def test_should_count_manual_select_with_include
|
289
|
-
assert_equal 6, Account.count(:select => "DISTINCT accounts.id", :include => :firm)
|
290
|
-
end
|
291
|
-
|
292
|
-
def test_count_with_column_parameter
|
293
|
-
assert_equal 5, Account.count(:firm_id)
|
294
|
-
end
|
295
|
-
|
296
|
-
def test_count_with_column_and_options_parameter
|
297
|
-
assert_equal 2, Account.count(:firm_id, :conditions => "credit_limit = 50")
|
298
|
-
end
|
299
|
-
|
300
|
-
def test_count_with_no_parameters_isnt_deprecated
|
301
|
-
assert_not_deprecated { Account.count }
|
302
|
-
end
|
303
|
-
|
304
|
-
def test_count_with_too_many_parameters_raises
|
305
|
-
assert_raise(ArgumentError) { Account.count(1, 2, 3) }
|
306
|
-
end
|
307
|
-
|
308
|
-
def test_count_with_scoped_has_many_through_association
|
309
|
-
assert_equal 1, owners(:blackbeard).toys.with_name('Bone').count
|
310
|
-
end
|
311
|
-
|
312
|
-
def test_should_sum_expression
|
313
|
-
assert_equal 636, Account.sum("2 * credit_limit").to_i
|
314
|
-
end
|
315
|
-
|
316
|
-
def test_count_with_from_option
|
317
|
-
assert_equal Company.count(:all), Company.count(:all, :from => 'companies')
|
318
|
-
assert_equal Account.count(:all, :conditions => "credit_limit = 50"),
|
319
|
-
Account.count(:all, :from => 'accounts', :conditions => "credit_limit = 50")
|
320
|
-
assert_equal Company.count(:type, :conditions => {:type => "Firm"}),
|
321
|
-
Company.count(:type, :conditions => {:type => "Firm"}, :from => 'companies')
|
322
|
-
end
|
323
|
-
|
324
|
-
def test_sum_with_from_option
|
325
|
-
assert_equal Account.sum(:credit_limit), Account.sum(:credit_limit, :from => 'accounts')
|
326
|
-
assert_equal Account.sum(:credit_limit, :conditions => "credit_limit > 50"),
|
327
|
-
Account.sum(:credit_limit, :from => 'accounts', :conditions => "credit_limit > 50")
|
328
|
-
end
|
329
|
-
|
330
|
-
def test_average_with_from_option
|
331
|
-
assert_equal Account.average(:credit_limit), Account.average(:credit_limit, :from => 'accounts')
|
332
|
-
assert_equal Account.average(:credit_limit, :conditions => "credit_limit > 50"),
|
333
|
-
Account.average(:credit_limit, :from => 'accounts', :conditions => "credit_limit > 50")
|
334
|
-
end
|
335
|
-
|
336
|
-
def test_minimum_with_from_option
|
337
|
-
assert_equal Account.minimum(:credit_limit), Account.minimum(:credit_limit, :from => 'accounts')
|
338
|
-
assert_equal Account.minimum(:credit_limit, :conditions => "credit_limit > 50"),
|
339
|
-
Account.minimum(:credit_limit, :from => 'accounts', :conditions => "credit_limit > 50")
|
340
|
-
end
|
341
|
-
|
342
|
-
def test_maximum_with_from_option
|
343
|
-
assert_equal Account.maximum(:credit_limit), Account.maximum(:credit_limit, :from => 'accounts')
|
344
|
-
assert_equal Account.maximum(:credit_limit, :conditions => "credit_limit > 50"),
|
345
|
-
Account.maximum(:credit_limit, :from => 'accounts', :conditions => "credit_limit > 50")
|
346
|
-
end
|
347
|
-
|
348
|
-
def test_from_option_with_specified_index
|
349
|
-
if Edge.connection.adapter_name == 'MySQL'
|
350
|
-
assert_equal Edge.count(:all), Edge.count(:all, :from => 'edges USE INDEX(unique_edge_index)')
|
351
|
-
assert_equal Edge.count(:all, :conditions => 'sink_id < 5'),
|
352
|
-
Edge.count(:all, :from => 'edges USE INDEX(unique_edge_index)', :conditions => 'sink_id < 5')
|
353
|
-
end
|
354
|
-
end
|
355
|
-
|
356
|
-
def test_from_option_with_table_different_than_class
|
357
|
-
assert_equal Account.count(:all), Company.count(:all, :from => 'accounts')
|
358
|
-
end
|
359
|
-
|
360
|
-
end
|