From 8d365b914de693d7a7bc6c05739e38bfafd0bf7f Mon Sep 17 00:00:00 2001 From: Toks Date: Mon, 27 Oct 2014 23:55:18 -0400 Subject: [PATCH] fixes #1473 --- app/models/tag_implication.rb | 26 ++++++++++------------ test/unit/tag_implication_test.rb | 37 ++++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/app/models/tag_implication.rb b/app/models/tag_implication.rb index 4672c77e0..8c971d6ae 100644 --- a/app/models/tag_implication.rb +++ b/app/models/tag_implication.rb @@ -1,7 +1,7 @@ class TagImplication < ActiveRecord::Base before_save :update_descendant_names - after_save :update_descendant_names_for_parent - after_destroy :update_descendant_names_for_parent + after_save :update_descendant_names_for_parents + after_destroy :update_descendant_names_for_parents belongs_to :creator, :class_name => "User" before_validation :initialize_creator, :on => :create before_validation :normalize_names @@ -50,12 +50,10 @@ class TagImplication < ActiveRecord::Base update_column(:descendant_names, descendant_names) end - def update_descendant_names_for_parent - p = parent - - while p - p.update_descendant_names! - p = p.parent + def update_descendant_names_for_parents + parents.each do |parent| + parent.update_descendant_names! + parent.update_descendant_names_for_parents end end @@ -65,12 +63,12 @@ class TagImplication < ActiveRecord::Base end module ParentMethods - def parent - @parent ||= self.class.where(["consequent_name = ?", antecedent_name]).first + def parents + @parents ||= self.class.where(["consequent_name = ?", antecedent_name]) end - def clear_parent_cache - @parent = nil + def clear_parents_cache + @parents = nil end end @@ -128,7 +126,7 @@ class TagImplication < ActiveRecord::Base update_column(:status, "processing") update_posts update_column(:status, "active") - update_descendant_names_for_parent + update_descendant_names_for_parents rescue Exception => e update_column(:status, "error: #{e}") end @@ -201,7 +199,7 @@ class TagImplication < ActiveRecord::Base def reload(options = {}) super - clear_parent_cache + clear_parents_cache clear_descendants_cache end diff --git a/test/unit/tag_implication_test.rb b/test/unit/tag_implication_test.rb index 6f2645166..f92180baf 100644 --- a/test/unit/tag_implication_test.rb +++ b/test/unit/tag_implication_test.rb @@ -67,6 +67,8 @@ class TagImplicationTest < ActiveSupport::TestCase should "update its descendants on save" do ti1 = FactoryGirl.create(:tag_implication, :antecedent_name => "aaa", :consequent_name => "bbb") ti2 = FactoryGirl.create(:tag_implication, :antecedent_name => "ccc", :consequent_name => "ddd") + ti1.reload + ti2.reload ti2.update_attributes( :antecedent_name => "bbb" ) @@ -76,18 +78,29 @@ class TagImplicationTest < ActiveSupport::TestCase assert_equal("ddd", ti2.descendant_names) end - should "update the descendants for its parent on destroy" do + should "update the descendants for all of its parents on destroy" do ti1 = FactoryGirl.create(:tag_implication, :antecedent_name => "aaa", :consequent_name => "bbb") - ti2 = FactoryGirl.create(:tag_implication, :antecedent_name => "bbb", :consequent_name => "ccc") - ti3 = FactoryGirl.create(:tag_implication, :antecedent_name => "ccc", :consequent_name => "ddd") - ti2.destroy + ti2 = FactoryGirl.create(:tag_implication, :antecedent_name => "xxx", :consequent_name => "bbb") + ti3 = FactoryGirl.create(:tag_implication, :antecedent_name => "bbb", :consequent_name => "ccc") + ti4 = FactoryGirl.create(:tag_implication, :antecedent_name => "ccc", :consequent_name => "ddd") ti1.reload + ti2.reload ti3.reload + ti4.reload + assert_equal("bbb ccc ddd", ti1.descendant_names) + assert_equal("bbb ccc ddd", ti2.descendant_names) + assert_equal("ccc ddd", ti3.descendant_names) + assert_equal("ddd", ti4.descendant_names) + ti3.destroy + ti1.reload + ti2.reload + ti4.reload assert_equal("bbb", ti1.descendant_names) - assert_equal("ddd", ti3.descendant_names) + assert_equal("bbb", ti2.descendant_names) + assert_equal("ddd", ti4.descendant_names) end - should "update the descendants for its parent on create" do + should "update the descendants for all of its parents on create" do ti1 = FactoryGirl.create(:tag_implication, :antecedent_name => "aaa", :consequent_name => "bbb") ti1.reload assert_equal("active", ti1.status) @@ -117,6 +130,18 @@ class TagImplicationTest < ActiveSupport::TestCase assert_equal("ccc ddd eee", ti2.descendant_names) assert_equal("ddd", ti3.descendant_names) assert_equal("eee", ti4.descendant_names) + + ti5 = FactoryGirl.create(:tag_implication, :antecedent_name => "xxx", :consequent_name => "bbb") + ti1.reload + ti2.reload + ti3.reload + ti4.reload + ti5.reload + assert_equal("bbb ccc ddd eee", ti1.descendant_names) + assert_equal("ccc ddd eee", ti2.descendant_names) + assert_equal("ddd", ti3.descendant_names) + assert_equal("eee", ti4.descendant_names) + assert_equal("bbb ccc ddd eee", ti5.descendant_names) end should "update any affected post upon save" do