提交 a4ce0659 编写于 作者: R Rafael Mendonça França

Merge pull request #13786 from terracatta/master

Ensure AR #second, #third, etc. finders work through associations
......@@ -96,11 +96,31 @@ def find(*args)
end
def first(*args)
first_or_last(:first, *args)
first_nth_or_last(:first, *args)
end
def second(*args)
first_nth_or_last(:second, *args)
end
def third(*args)
first_nth_or_last(:third, *args)
end
def fourth(*args)
first_nth_or_last(:fourth, *args)
end
def fifth(*args)
first_nth_or_last(:fifth, *args)
end
def forty_two(*args)
first_nth_or_last(:forty_two, *args)
end
def last(*args)
first_or_last(:last, *args)
first_nth_or_last(:last, *args)
end
def build(attributes = {}, &block)
......@@ -526,7 +546,7 @@ def callbacks_for(callback_name)
# * target already loaded
# * owner is new record
# * target contains new or changed record(s)
def fetch_first_or_last_using_find?(args)
def fetch_first_nth_or_last_using_find?(args)
if args.first.is_a?(Hash)
true
else
......@@ -564,10 +584,10 @@ def find_by_scan(*args)
end
# Fetches the first/last using SQL if possible, otherwise from the target array.
def first_or_last(type, *args)
def first_nth_or_last(type, *args)
args.shift if args.first.is_a?(Hash) && args.first.empty?
collection = fetch_first_or_last_using_find?(args) ? scope : load_target
collection = fetch_first_nth_or_last_using_find?(args) ? scope : load_target
collection.send(type, *args).tap do |record|
set_inverse_instance record if record.is_a? ActiveRecord::Base
end
......
......@@ -170,6 +170,32 @@ def first(*args)
@association.first(*args)
end
# Same as +first+ except returns only the second record.
def second(*args)
@association.second(*args)
end
# Same as +first+ except returns only the third record.
def third(*args)
@association.third(*args)
end
# Same as +first+ except returns only the fourth record.
def fourth(*args)
@association.fourth(*args)
end
# Same as +first+ except returns only the fifth record.
def fifth(*args)
@association.fifth(*args)
end
# Same as +first+ except returns only the forty second record.
# Also known as accessing "the reddit".
def forty_two(*args)
@association.forty_two(*args)
end
# Returns the last record, or the last +n+ records, from the collection.
# If the collection is empty, the first form returns +nil+, and the second
# form returns an empty array.
......
......@@ -129,7 +129,7 @@ def first(limit = nil)
if limit
find_nth_with_limit(offset_value, limit)
else
find_nth(offset_value)
find_nth(:first, offset_value)
end
end
......@@ -179,7 +179,7 @@ def last!
# Person.offset(3).second # returns the second object from OFFSET 3 (which is OFFSET 4)
# Person.where(["user_name = :u", { u: user_name }]).second
def second
find_nth(offset_value ? offset_value + 1 : 1)
find_nth(:second, offset_value ? offset_value + 1 : 1)
end
# Same as +second+ but raises <tt>ActiveRecord::RecordNotFound</tt> if no record
......@@ -195,7 +195,7 @@ def second!
# Person.offset(3).third # returns the third object from OFFSET 3 (which is OFFSET 5)
# Person.where(["user_name = :u", { u: user_name }]).third
def third
find_nth(offset_value ? offset_value + 2 : 2)
find_nth(:third, offset_value ? offset_value + 2 : 2)
end
# Same as +third+ but raises <tt>ActiveRecord::RecordNotFound</tt> if no record
......@@ -211,7 +211,7 @@ def third!
# Person.offset(3).fourth # returns the fourth object from OFFSET 3 (which is OFFSET 6)
# Person.where(["user_name = :u", { u: user_name }]).fourth
def fourth
find_nth(offset_value ? offset_value + 3 : 3)
find_nth(:fourth, offset_value ? offset_value + 3 : 3)
end
# Same as +fourth+ but raises <tt>ActiveRecord::RecordNotFound</tt> if no record
......@@ -227,7 +227,7 @@ def fourth!
# Person.offset(3).fifth # returns the fifth object from OFFSET 3 (which is OFFSET 7)
# Person.where(["user_name = :u", { u: user_name }]).fifth
def fifth
find_nth(offset_value ? offset_value + 4 : 4)
find_nth(:fifth, offset_value ? offset_value + 4 : 4)
end
# Same as +fifth+ but raises <tt>ActiveRecord::RecordNotFound</tt> if no record
......@@ -243,7 +243,7 @@ def fifth!
# Person.offset(3).forty_two # returns the fifth object from OFFSET 3 (which is OFFSET 44)
# Person.where(["user_name = :u", { u: user_name }]).forty_two
def forty_two
find_nth(offset_value ? offset_value + 41 : 41)
find_nth(:forty_two, offset_value ? offset_value + 41 : 41)
end
# Same as +forty_two+ but raises <tt>ActiveRecord::RecordNotFound</tt> if no record
......@@ -444,9 +444,9 @@ def find_take
end
end
def find_nth(offset)
def find_nth(ordinal, offset)
if loaded?
@records.first
@records.send(ordinal)
else
@offsets[offset] ||= find_nth_with_limit(offset, 1).first
end
......
......@@ -215,6 +215,31 @@ def test_no_sql_should_be_fired_if_association_already_loaded
bulbs.first({})
end
assert_no_queries do
bulbs.second()
bulbs.second({})
end
assert_no_queries do
bulbs.third()
bulbs.third({})
end
assert_no_queries do
bulbs.fourth()
bulbs.fourth({})
end
assert_no_queries do
bulbs.fifth()
bulbs.fifth({})
end
assert_no_queries do
bulbs.forty_two()
bulbs.forty_two({})
end
assert_no_queries do
bulbs.last()
bulbs.last({})
......@@ -242,11 +267,11 @@ def force_signal37_to_load_all_clients_of_firm
# sometimes tests on Oracle fail if ORDER BY is not provided therefore add always :order with :first
def test_counting_with_counter_sql
assert_equal 2, Firm.all.merge!(:order => "id").first.clients.count
assert_equal 3, Firm.all.merge!(:order => "id").first.clients.count
end
def test_counting
assert_equal 2, Firm.all.merge!(:order => "id").first.plain_clients.count
assert_equal 3, Firm.all.merge!(:order => "id").first.plain_clients.count
end
def test_counting_with_single_hash
......@@ -254,7 +279,7 @@ def test_counting_with_single_hash
end
def test_counting_with_column_name_and_hash
assert_equal 2, Firm.all.merge!(:order => "id").first.plain_clients.count(:name)
assert_equal 3, Firm.all.merge!(:order => "id").first.plain_clients.count(:name)
end
def test_counting_with_association_limit
......@@ -264,17 +289,17 @@ def test_counting_with_association_limit
end
def test_finding
assert_equal 2, Firm.all.merge!(:order => "id").first.clients.length
assert_equal 3, Firm.all.merge!(:order => "id").first.clients.length
end
def test_finding_array_compatibility
assert_equal 2, Firm.order(:id).find{|f| f.id > 0}.clients.length
assert_equal 3, Firm.order(:id).find{|f| f.id > 0}.clients.length
end
def test_find_many_with_merged_options
assert_equal 1, companies(:first_firm).limited_clients.size
assert_equal 1, companies(:first_firm).limited_clients.to_a.size
assert_equal 2, companies(:first_firm).limited_clients.limit(nil).to_a.size
assert_equal 3, companies(:first_firm).limited_clients.limit(nil).to_a.size
end
def test_find_should_append_to_association_order
......@@ -283,8 +308,8 @@ def test_find_should_append_to_association_order
end
def test_dynamic_find_should_respect_association_order
assert_equal companies(:second_client), companies(:first_firm).clients_sorted_desc.where("type = 'Client'").first
assert_equal companies(:second_client), companies(:first_firm).clients_sorted_desc.find_by_type('Client')
assert_equal companies(:another_first_firm_client), companies(:first_firm).clients_sorted_desc.where("type = 'Client'").first
assert_equal companies(:another_first_firm_client), companies(:first_firm).clients_sorted_desc.find_by_type('Client')
end
def test_cant_save_has_many_readonly_association
......@@ -297,7 +322,7 @@ def test_finding_default_orders
end
def test_finding_with_different_class_name_and_order
assert_equal "Microsoft", Firm.all.merge!(:order => "id").first.clients_sorted_desc.first.name
assert_equal "Apex", Firm.all.merge!(:order => "id").first.clients_sorted_desc.first.name
end
def test_finding_with_foreign_key
......@@ -355,7 +380,7 @@ def test_find_ids_and_inverse_of
def test_find_all
firm = Firm.all.merge!(:order => "id").first
assert_equal 2, firm.clients.where("#{QUOTED_TYPE} = 'Client'").to_a.length
assert_equal 3, firm.clients.where("#{QUOTED_TYPE} = 'Client'").to_a.length
assert_equal 1, firm.clients.where("name = 'Summit'").to_a.length
end
......@@ -364,7 +389,7 @@ def test_find_each
assert ! firm.clients.loaded?
assert_queries(3) do
assert_queries(4) do
firm.clients.find_each(:batch_size => 1) {|c| assert_equal firm.id, c.firm_id }
end
......@@ -434,15 +459,15 @@ def test_find_in_collection
def test_find_grouped
all_clients_of_firm1 = Client.all.merge!(:where => "firm_id = 1").to_a
grouped_clients_of_firm1 = Client.all.merge!(:where => "firm_id = 1", :group => "firm_id", :select => 'firm_id, count(id) as clients_count').to_a
assert_equal 2, all_clients_of_firm1.size
assert_equal 3, all_clients_of_firm1.size
assert_equal 1, grouped_clients_of_firm1.size
end
def test_find_scoped_grouped
assert_equal 1, companies(:first_firm).clients_grouped_by_firm_id.size
assert_equal 1, companies(:first_firm).clients_grouped_by_firm_id.length
assert_equal 2, companies(:first_firm).clients_grouped_by_name.size
assert_equal 2, companies(:first_firm).clients_grouped_by_name.length
assert_equal 3, companies(:first_firm).clients_grouped_by_name.size
assert_equal 3, companies(:first_firm).clients_grouped_by_name.length
end
def test_find_scoped_grouped_having
......@@ -470,17 +495,17 @@ def test_adding
force_signal37_to_load_all_clients_of_firm
natural = Client.new("name" => "Natural Company")
companies(:first_firm).clients_of_firm << natural
assert_equal 2, companies(:first_firm).clients_of_firm.size # checking via the collection
assert_equal 2, companies(:first_firm).clients_of_firm(true).size # checking using the db
assert_equal 3, companies(:first_firm).clients_of_firm.size # checking via the collection
assert_equal 3, companies(:first_firm).clients_of_firm(true).size # checking using the db
assert_equal natural, companies(:first_firm).clients_of_firm.last
end
def test_adding_using_create
first_firm = companies(:first_firm)
assert_equal 2, first_firm.plain_clients.size
first_firm.plain_clients.create(:name => "Natural Company")
assert_equal 3, first_firm.plain_clients.length
assert_equal 3, first_firm.plain_clients.size
first_firm.plain_clients.create(:name => "Natural Company")
assert_equal 4, first_firm.plain_clients.length
assert_equal 4, first_firm.plain_clients.size
end
def test_create_with_bang_on_has_many_when_parent_is_new_raises
......@@ -519,8 +544,8 @@ def test_adding_a_mismatch_class
def test_adding_a_collection
force_signal37_to_load_all_clients_of_firm
companies(:first_firm).clients_of_firm.concat([Client.new("name" => "Natural Company"), Client.new("name" => "Apple")])
assert_equal 3, companies(:first_firm).clients_of_firm.size
assert_equal 3, companies(:first_firm).clients_of_firm(true).size
assert_equal 4, companies(:first_firm).clients_of_firm.size
assert_equal 4, companies(:first_firm).clients_of_firm(true).size
end
def test_transactions_when_adding_to_persisted
......@@ -573,7 +598,7 @@ def test_collection_size_after_building
company = companies(:first_firm) # company already has one client
company.clients_of_firm.build("name" => "Another Client")
company.clients_of_firm.build("name" => "Yet Another Client")
assert_equal 3, company.clients_of_firm.size
assert_equal 4, company.clients_of_firm.size
end
def test_collection_not_empty_after_building
......@@ -649,14 +674,14 @@ def test_create_without_loading_association
Firm.column_names
Client.column_names
assert_equal 1, first_firm.clients_of_firm.size
assert_equal 2, first_firm.clients_of_firm.size
first_firm.clients_of_firm.reset
assert_queries(1) do
first_firm.clients_of_firm.create(:name => "Superstars")
end
assert_equal 2, first_firm.clients_of_firm.size
assert_equal 3, first_firm.clients_of_firm.size
end
def test_create
......@@ -669,7 +694,7 @@ def test_create
def test_create_many
companies(:first_firm).clients_of_firm.create([{"name" => "Another Client"}, {"name" => "Another Client II"}])
assert_equal 3, companies(:first_firm).clients_of_firm(true).size
assert_equal 4, companies(:first_firm).clients_of_firm(true).size
end
def test_create_followed_by_save_does_not_load_target
......@@ -681,8 +706,8 @@ def test_create_followed_by_save_does_not_load_target
def test_deleting
force_signal37_to_load_all_clients_of_firm
companies(:first_firm).clients_of_firm.delete(companies(:first_firm).clients_of_firm.first)
assert_equal 0, companies(:first_firm).clients_of_firm.size
assert_equal 0, companies(:first_firm).clients_of_firm(true).size
assert_equal 1, companies(:first_firm).clients_of_firm.size
assert_equal 1, companies(:first_firm).clients_of_firm(true).size
end
def test_deleting_before_save
......@@ -779,8 +804,8 @@ def test_calling_update_attributes_changing_ids_doesnt_change_counter_cache
def test_deleting_a_collection
force_signal37_to_load_all_clients_of_firm
companies(:first_firm).clients_of_firm.create("name" => "Another Client")
assert_equal 2, companies(:first_firm).clients_of_firm.size
companies(:first_firm).clients_of_firm.delete([companies(:first_firm).clients_of_firm[0], companies(:first_firm).clients_of_firm[1]])
assert_equal 3, companies(:first_firm).clients_of_firm.size
companies(:first_firm).clients_of_firm.delete([companies(:first_firm).clients_of_firm[0], companies(:first_firm).clients_of_firm[1], companies(:first_firm).clients_of_firm[2]])
assert_equal 0, companies(:first_firm).clients_of_firm.size
assert_equal 0, companies(:first_firm).clients_of_firm(true).size
end
......@@ -789,7 +814,7 @@ def test_delete_all
force_signal37_to_load_all_clients_of_firm
companies(:first_firm).dependent_clients_of_firm.create("name" => "Another Client")
clients = companies(:first_firm).dependent_clients_of_firm.to_a
assert_equal 2, clients.count
assert_equal 3, clients.count
assert_difference "Client.count", -(clients.count) do
companies(:first_firm).dependent_clients_of_firm.delete_all
......@@ -799,7 +824,7 @@ def test_delete_all
def test_delete_all_with_not_yet_loaded_association_collection
force_signal37_to_load_all_clients_of_firm
companies(:first_firm).clients_of_firm.create("name" => "Another Client")
assert_equal 2, companies(:first_firm).clients_of_firm.size
assert_equal 3, companies(:first_firm).clients_of_firm.size
companies(:first_firm).clients_of_firm.reset
companies(:first_firm).clients_of_firm.delete_all
assert_equal 0, companies(:first_firm).clients_of_firm.size
......@@ -832,7 +857,7 @@ def test_transaction_when_deleting_new_record
def test_clearing_an_association_collection
firm = companies(:first_firm)
client_id = firm.clients_of_firm.first.id
assert_equal 1, firm.clients_of_firm.size
assert_equal 2, firm.clients_of_firm.size
firm.clients_of_firm.clear
......@@ -866,7 +891,7 @@ def test_clearing_updates_counter_cache_when_inverse_counter_cache_is_a_symbol_w
def test_clearing_a_dependent_association_collection
firm = companies(:first_firm)
client_id = firm.dependent_clients_of_firm.first.id
assert_equal 1, firm.dependent_clients_of_firm.size
assert_equal 2, firm.dependent_clients_of_firm.size
assert_equal 1, Client.find_by_id(client_id).client_of
# :delete_all is called on each client since the dependent options is :destroy
......@@ -897,7 +922,7 @@ def test_delete_all_accepts_limited_parameters
def test_clearing_an_exclusively_dependent_association_collection
firm = companies(:first_firm)
client_id = firm.exclusively_dependent_clients_of_firm.first.id
assert_equal 1, firm.exclusively_dependent_clients_of_firm.size
assert_equal 2, firm.exclusively_dependent_clients_of_firm.size
assert_equal [], Client.destroyed_client_ids[firm.id]
......@@ -953,10 +978,10 @@ def test_dependent_association_respects_optional_hash_conditions_on_delete
def test_delete_all_association_with_primary_key_deletes_correct_records
firm = Firm.first
# break the vanilla firm_id foreign key
assert_equal 2, firm.clients.count
assert_equal 3, firm.clients.count
firm.clients.first.update_columns(firm_id: nil)
assert_equal 1, firm.clients(true).count
assert_equal 1, firm.clients_using_primary_key_with_delete_all.count
assert_equal 2, firm.clients(true).count
assert_equal 2, firm.clients_using_primary_key_with_delete_all.count
old_record = firm.clients_using_primary_key_with_delete_all.first
firm = Firm.first
firm.destroy
......@@ -988,8 +1013,8 @@ def test_deleting_a_item_which_is_not_in_the_collection
force_signal37_to_load_all_clients_of_firm
summit = Client.find_by_name('Summit')
companies(:first_firm).clients_of_firm.delete(summit)
assert_equal 1, companies(:first_firm).clients_of_firm.size
assert_equal 1, companies(:first_firm).clients_of_firm(true).size
assert_equal 2, companies(:first_firm).clients_of_firm.size
assert_equal 2, companies(:first_firm).clients_of_firm(true).size
assert_equal 2, summit.client_of
end
......@@ -1026,8 +1051,8 @@ def test_destroying
companies(:first_firm).clients_of_firm.destroy(companies(:first_firm).clients_of_firm.first)
end
assert_equal 0, companies(:first_firm).reload.clients_of_firm.size
assert_equal 0, companies(:first_firm).clients_of_firm(true).size
assert_equal 1, companies(:first_firm).reload.clients_of_firm.size
assert_equal 1, companies(:first_firm).clients_of_firm(true).size
end
def test_destroying_by_fixnum_id
......@@ -1037,8 +1062,8 @@ def test_destroying_by_fixnum_id
companies(:first_firm).clients_of_firm.destroy(companies(:first_firm).clients_of_firm.first.id)
end
assert_equal 0, companies(:first_firm).reload.clients_of_firm.size
assert_equal 0, companies(:first_firm).clients_of_firm(true).size
assert_equal 1, companies(:first_firm).reload.clients_of_firm.size
assert_equal 1, companies(:first_firm).clients_of_firm(true).size
end
def test_destroying_by_string_id
......@@ -1048,21 +1073,21 @@ def test_destroying_by_string_id
companies(:first_firm).clients_of_firm.destroy(companies(:first_firm).clients_of_firm.first.id.to_s)
end
assert_equal 0, companies(:first_firm).reload.clients_of_firm.size
assert_equal 0, companies(:first_firm).clients_of_firm(true).size
assert_equal 1, companies(:first_firm).reload.clients_of_firm.size
assert_equal 1, companies(:first_firm).clients_of_firm(true).size
end
def test_destroying_a_collection
force_signal37_to_load_all_clients_of_firm
companies(:first_firm).clients_of_firm.create("name" => "Another Client")
assert_equal 2, companies(:first_firm).clients_of_firm.size
assert_equal 3, companies(:first_firm).clients_of_firm.size
assert_difference "Client.count", -2 do
companies(:first_firm).clients_of_firm.destroy([companies(:first_firm).clients_of_firm[0], companies(:first_firm).clients_of_firm[1]])
end
assert_equal 0, companies(:first_firm).reload.clients_of_firm.size
assert_equal 0, companies(:first_firm).clients_of_firm(true).size
assert_equal 1, companies(:first_firm).reload.clients_of_firm.size
assert_equal 1, companies(:first_firm).clients_of_firm(true).size
end
def test_destroy_all
......@@ -1078,7 +1103,7 @@ def test_destroy_all
def test_dependence
firm = companies(:first_firm)
assert_equal 2, firm.clients.size
assert_equal 3, firm.clients.size
firm.destroy
assert Client.all.merge!(:where => "firm_id=#{firm.id}").to_a.empty?
end
......@@ -1091,14 +1116,14 @@ def test_dependence_for_associations_with_hash_condition
def test_destroy_dependent_when_deleted_from_association
# sometimes tests on Oracle fail if ORDER BY is not provided therefore add always :order with :first
firm = Firm.all.merge!(:order => "id").first
assert_equal 2, firm.clients.size
assert_equal 3, firm.clients.size
client = firm.clients.first
firm.clients.delete(client)
assert_raise(ActiveRecord::RecordNotFound) { Client.find(client.id) }
assert_raise(ActiveRecord::RecordNotFound) { firm.clients.find(client.id) }
assert_equal 1, firm.clients.size
assert_equal 2, firm.clients.size
end
def test_three_levels_of_dependence
......@@ -1113,12 +1138,12 @@ def test_three_levels_of_dependence
def test_dependence_with_transaction_support_on_failure
firm = companies(:first_firm)
clients = firm.clients
assert_equal 2, clients.length
assert_equal 3, clients.length
clients.last.instance_eval { def overwrite_to_raise() raise "Trigger rollback" end }
firm.destroy rescue "do nothing"
assert_equal 2, Client.all.merge!(:where => "firm_id=#{firm.id}").to_a.size
assert_equal 3, Client.all.merge!(:where => "firm_id=#{firm.id}").to_a.size
end
def test_dependence_on_account
......@@ -1239,7 +1264,7 @@ def test_transactions_when_replacing_on_new_record
end
def test_get_ids
assert_equal [companies(:first_client).id, companies(:second_client).id], companies(:first_firm).client_ids
assert_equal [companies(:first_client).id, companies(:second_client).id, companies(:another_first_firm_client).id], companies(:first_firm).client_ids
end
def test_get_ids_for_loaded_associations
......@@ -1254,7 +1279,7 @@ def test_get_ids_for_loaded_associations
def test_get_ids_for_unloaded_associations_does_not_load_them
company = companies(:first_firm)
assert !company.clients.loaded?
assert_equal [companies(:first_client).id, companies(:second_client).id], company.client_ids
assert_equal [companies(:first_client).id, companies(:second_client).id, companies(:another_first_firm_client).id], company.client_ids
assert !company.clients.loaded?
end
......@@ -1263,7 +1288,7 @@ def test_get_ids_ignores_include_option
end
def test_get_ids_for_ordered_association
assert_equal [companies(:second_client).id, companies(:first_client).id], companies(:first_firm).clients_ordered_by_name_ids
assert_equal [companies(:another_first_firm_client).id, companies(:second_client).id, companies(:first_client).id], companies(:first_firm).clients_ordered_by_name_ids
end
def test_get_ids_for_association_on_new_record_does_not_try_to_find_records
......@@ -1357,9 +1382,10 @@ def test_include_returns_false_for_non_matching_record_to_verify_scoping
assert_equal false, firm.clients.include?(client)
end
def test_calling_first_or_last_on_association_should_not_load_association
def test_calling_first_nth_or_last_on_association_should_not_load_association
firm = companies(:first_firm)
firm.clients.first
firm.clients.second
firm.clients.last
assert !firm.clients.loaded?
end
......@@ -1384,30 +1410,33 @@ def test_calling_first_or_last_on_existing_record_with_build_should_load_associa
assert_queries 1 do
firm.clients.first
firm.clients.second
firm.clients.last
end
assert firm.clients.loaded?
end
def test_calling_first_or_last_on_existing_record_with_create_should_not_load_association
def test_calling_first_nth_or_last_on_existing_record_with_create_should_not_load_association
firm = companies(:first_firm)
firm.clients.create(:name => 'Foo')
assert !firm.clients.loaded?
assert_queries 2 do
assert_queries 3 do
firm.clients.first
firm.clients.second
firm.clients.last
end
assert !firm.clients.loaded?
end
def test_calling_first_or_last_on_new_record_should_not_run_queries
def test_calling_first_nth_or_last_on_new_record_should_not_run_queries
firm = Firm.new
assert_no_queries do
firm.clients.first
firm.clients.second
firm.clients.last
end
end
......@@ -1494,7 +1523,7 @@ def test_calling_many_should_return_false_if_none_or_one
def test_calling_many_should_return_true_if_more_than_one
firm = companies(:first_firm)
assert firm.clients.many?
assert_equal 2, firm.clients.size
assert_equal 3, firm.clients.size
end
def test_joins_with_namespaced_model_should_use_correct_type
......
......@@ -401,7 +401,7 @@ def test_invalid_build
assert_equal new_client, companies(:first_firm).clients_of_firm.last
assert !companies(:first_firm).save
assert !new_client.persisted?
assert_equal 1, companies(:first_firm).clients_of_firm(true).size
assert_equal 2, companies(:first_firm).clients_of_firm(true).size
end
def test_adding_before_save
......@@ -455,7 +455,7 @@ def test_build_before_save
company.name += '-changed'
assert_queries(2) { assert company.save }
assert new_client.persisted?
assert_equal 2, company.clients_of_firm(true).size
assert_equal 3, company.clients_of_firm(true).size
end
def test_build_many_before_save
......@@ -464,7 +464,7 @@ def test_build_many_before_save
company.name += '-changed'
assert_queries(3) { assert company.save }
assert_equal 3, company.clients_of_firm(true).size
assert_equal 4, company.clients_of_firm(true).size
end
def test_build_via_block_before_save
......@@ -475,7 +475,7 @@ def test_build_via_block_before_save
company.name += '-changed'
assert_queries(2) { assert company.save }
assert new_client.persisted?
assert_equal 2, company.clients_of_firm(true).size
assert_equal 3, company.clients_of_firm(true).size
end
def test_build_many_via_block_before_save
......@@ -488,7 +488,7 @@ def test_build_many_via_block_before_save
company.name += '-changed'
assert_queries(3) { assert company.save }
assert_equal 3, company.clients_of_firm(true).size
assert_equal 4, company.clients_of_firm(true).size
end
def test_replace_on_new_object
......
......@@ -278,7 +278,7 @@ def test_should_calculate_grouped_by_function
c = Company.group("UPPER(#{QUOTED_TYPE})").count(:all)
assert_equal 2, c[nil]
assert_equal 1, c['DEPENDENTFIRM']
assert_equal 4, c['CLIENT']
assert_equal 5, c['CLIENT']
assert_equal 2, c['FIRM']
end
......@@ -286,7 +286,7 @@ def test_should_calculate_grouped_by_function_with_table_alias
c = Company.group("UPPER(companies.#{QUOTED_TYPE})").count(:all)
assert_equal 2, c[nil]
assert_equal 1, c['DEPENDENTFIRM']
assert_equal 4, c['CLIENT']
assert_equal 5, c['CLIENT']
assert_equal 2, c['FIRM']
end
......
......@@ -900,8 +900,8 @@ def test_select_value
end
def test_select_values
assert_equal ["1","2","3","4","5","6","7","8","9", "10"], Company.connection.select_values("SELECT id FROM companies ORDER BY id").map! { |i| i.to_s }
assert_equal ["37signals","Summit","Microsoft", "Flamboyant Software", "Ex Nihilo", "RailsCore", "Leetsoft", "Jadedpixel", "Odegy", "Ex Nihilo Part Deux"], Company.connection.select_values("SELECT name FROM companies ORDER BY id")
assert_equal ["1","2","3","4","5","6","7","8","9", "10", "11"], Company.connection.select_values("SELECT id FROM companies ORDER BY id").map! { |i| i.to_s }
assert_equal ["37signals","Summit","Microsoft", "Flamboyant Software", "Ex Nihilo", "RailsCore", "Leetsoft", "Jadedpixel", "Odegy", "Ex Nihilo Part Deux", "Apex"], Company.connection.select_values("SELECT name FROM companies ORDER BY id")
end
def test_select_rows
......
......@@ -222,9 +222,9 @@ def test_new_with_autoload_paths
end
def test_inheritance_condition
assert_equal 10, Company.count
assert_equal 11, Company.count
assert_equal 2, Firm.count
assert_equal 4, Client.count
assert_equal 5, Client.count
end
def test_alt_inheritance_condition
......
......@@ -57,3 +57,11 @@ odegy:
id: 9
name: Odegy
type: ExclusivelyDependentFirm
another_first_firm_client:
id: 11
type: Client
firm_id: 1
client_of: 1
name: Apex
firm_name: 37signals
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册