提交 eebcebde 编写于 作者: P Piotr Jakubowski

When deleting through records, take into account association conditions

Fixes #18424.

When deleting through records, it didn't take into account the
conditions that may have been affecting join model table, but was
defined in association definition.
上级 8352c8c6
......@@ -132,26 +132,27 @@ def delete_records(records, method)
scope = through_association.scope
scope.where! construct_join_attributes(*records)
scope_with_association_conditions = scope.where through_scope_attributes
case method
when :destroy
if scope.klass.primary_key
count = scope.destroy_all.length
if scope_with_association_conditions.klass.primary_key
count = scope_with_association_conditions.destroy_all.length
else
scope.each(&:_run_destroy_callbacks)
scope_with_association_conditions.each(&:_run_destroy_callbacks)
arel = scope.arel
arel = scope_with_association_conditions.arel
stmt = Arel::DeleteManager.new
stmt.from scope.klass.arel_table
stmt.from scope_with_association_conditions.klass.arel_table
stmt.wheres = arel.constraints
count = scope.klass.connection.delete(stmt, 'SQL', scope.bound_attributes)
count = scope_with_association_conditions.klass.connection.delete(stmt, 'SQL', scope_with_association_conditions.bound_attributes)
end
when :nullify
count = scope.update_all(source_reflection.foreign_key => nil)
count = scope_with_association_conditions.update_all(source_reflection.foreign_key => nil)
else
count = scope.delete_all
count = scope_with_association_conditions.delete_all
end
delete_through_records(records)
......
......@@ -1215,4 +1215,20 @@ def test_has_many_through_do_not_cache_association_reader_if_the_though_method_h
ensure
TenantMembership.current_member = nil
end
def test_has_many_through_update_ids_with_conditions
author = Author.create :name => "Bill"
category = categories(:general)
author.update(special_categories_with_condition_ids: [category.id],
nonspecial_categories_with_condition_ids: [category.id])
assert_equal [category.id], author.special_categories_with_condition_ids
assert_equal [category.id], author.nonspecial_categories_with_condition_ids
author.update(nonspecial_categories_with_condition_ids: [])
author.reload
assert_equal [category.id], author.special_categories_with_condition_ids
assert_equal [], author.nonspecial_categories_with_condition_ids
end
end
......@@ -85,6 +85,9 @@ def ratings
has_many :special_categories, :through => :special_categorizations, :source => :category
has_one :special_category, :through => :special_categorizations, :source => :category
has_many :special_categories_with_conditions, -> { where(categorizations: {special: true}) }, :through => :categorizations, :source => :category
has_many :nonspecial_categories_with_conditions, -> { where(categorizations: {special: false}) }, :through => :categorizations, :source => :category
has_many :categories_like_general, -> { where(:name => 'General') }, :through => :categorizations, :source => :category, :class_name => 'Category'
has_many :categorized_posts, :through => :categorizations, :source => :post
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册