mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
delete correct records for a has_many with :primary_key and :dependent => :delete_all
Signed-off-by: Michael Koziarski <michael@koziarski.com>
This commit is contained in:
parent
11e798ae0f
commit
d625312fe1
4 changed files with 17 additions and 3 deletions
|
@ -1480,7 +1480,7 @@ module ActiveRecord
|
|||
if reflection.options.include?(:dependent)
|
||||
# Add polymorphic type if the :as option is present
|
||||
dependent_conditions = []
|
||||
dependent_conditions << "#{reflection.primary_key_name} = \#{record.quoted_id}"
|
||||
dependent_conditions << "#{reflection.primary_key_name} = \#{record.#{reflection.name}.send(:owner_quoted_id)}"
|
||||
dependent_conditions << "#{reflection.options[:as]}_type = '#{base_class.name}'" if reflection.options[:as]
|
||||
dependent_conditions << sanitize_sql(reflection.options[:conditions], reflection.quoted_table_name) if reflection.options[:conditions]
|
||||
dependent_conditions << extra_conditions if extra_conditions
|
||||
|
|
|
@ -659,6 +659,18 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
|
|||
assert_equal 1, Client.find_all_by_client_of(firm.id).size
|
||||
end
|
||||
|
||||
def test_delete_all_association_with_primary_key_deletes_correct_records
|
||||
firm = Firm.find(:first)
|
||||
# break the vanilla firm_id foreign key
|
||||
assert_equal 2, firm.clients.count
|
||||
firm.clients.first.update_attribute(:firm_id, nil)
|
||||
assert_equal 1, firm.clients(true).count
|
||||
assert_equal 1, firm.clients_using_primary_key_with_delete_all.count
|
||||
old_record = firm.clients_using_primary_key_with_delete_all.first
|
||||
firm = Firm.find(:first)
|
||||
firm.destroy
|
||||
assert Client.find_by_id(old_record.id).nil?
|
||||
end
|
||||
|
||||
def test_creation_respects_hash_condition
|
||||
ms_client = companies(:first_firm).clients_like_ms_with_hash_conditions.build
|
||||
|
|
|
@ -176,8 +176,8 @@ class ReflectionTest < ActiveRecord::TestCase
|
|||
|
||||
def test_reflection_of_all_associations
|
||||
# FIXME these assertions bust a lot
|
||||
assert_equal 36, Firm.reflect_on_all_associations.size
|
||||
assert_equal 26, Firm.reflect_on_all_associations(:has_many).size
|
||||
assert_equal 37, Firm.reflect_on_all_associations.size
|
||||
assert_equal 27, Firm.reflect_on_all_associations(:has_many).size
|
||||
assert_equal 10, Firm.reflect_on_all_associations(:has_one).size
|
||||
assert_equal 0, Firm.reflect_on_all_associations(:belongs_to).size
|
||||
end
|
||||
|
|
|
@ -68,6 +68,8 @@ class Firm < Company
|
|||
has_many :readonly_clients, :class_name => 'Client', :readonly => true
|
||||
has_many :clients_using_primary_key, :class_name => 'Client',
|
||||
:primary_key => 'name', :foreign_key => 'firm_name'
|
||||
has_many :clients_using_primary_key_with_delete_all, :class_name => 'Client',
|
||||
:primary_key => 'name', :foreign_key => 'firm_name', :dependent => :delete_all
|
||||
has_many :clients_grouped_by_firm_id, :class_name => "Client", :group => "firm_id", :select => "firm_id"
|
||||
has_many :clients_grouped_by_name, :class_name => "Client", :group => "name", :select => "name"
|
||||
|
||||
|
|
Loading…
Reference in a new issue