This commit is contained in:
Toks
2014-10-27 23:55:18 -04:00
parent 3035cd3c64
commit 8d365b914d
2 changed files with 43 additions and 20 deletions

View File

@@ -1,7 +1,7 @@
class TagImplication < ActiveRecord::Base class TagImplication < ActiveRecord::Base
before_save :update_descendant_names before_save :update_descendant_names
after_save :update_descendant_names_for_parent after_save :update_descendant_names_for_parents
after_destroy :update_descendant_names_for_parent after_destroy :update_descendant_names_for_parents
belongs_to :creator, :class_name => "User" belongs_to :creator, :class_name => "User"
before_validation :initialize_creator, :on => :create before_validation :initialize_creator, :on => :create
before_validation :normalize_names before_validation :normalize_names
@@ -50,12 +50,10 @@ class TagImplication < ActiveRecord::Base
update_column(:descendant_names, descendant_names) update_column(:descendant_names, descendant_names)
end end
def update_descendant_names_for_parent def update_descendant_names_for_parents
p = parent parents.each do |parent|
parent.update_descendant_names!
while p parent.update_descendant_names_for_parents
p.update_descendant_names!
p = p.parent
end end
end end
@@ -65,12 +63,12 @@ class TagImplication < ActiveRecord::Base
end end
module ParentMethods module ParentMethods
def parent def parents
@parent ||= self.class.where(["consequent_name = ?", antecedent_name]).first @parents ||= self.class.where(["consequent_name = ?", antecedent_name])
end end
def clear_parent_cache def clear_parents_cache
@parent = nil @parents = nil
end end
end end
@@ -128,7 +126,7 @@ class TagImplication < ActiveRecord::Base
update_column(:status, "processing") update_column(:status, "processing")
update_posts update_posts
update_column(:status, "active") update_column(:status, "active")
update_descendant_names_for_parent update_descendant_names_for_parents
rescue Exception => e rescue Exception => e
update_column(:status, "error: #{e}") update_column(:status, "error: #{e}")
end end
@@ -201,7 +199,7 @@ class TagImplication < ActiveRecord::Base
def reload(options = {}) def reload(options = {})
super super
clear_parent_cache clear_parents_cache
clear_descendants_cache clear_descendants_cache
end end

View File

@@ -67,6 +67,8 @@ class TagImplicationTest < ActiveSupport::TestCase
should "update its descendants on save" do should "update its descendants on save" do
ti1 = FactoryGirl.create(:tag_implication, :antecedent_name => "aaa", :consequent_name => "bbb") ti1 = FactoryGirl.create(:tag_implication, :antecedent_name => "aaa", :consequent_name => "bbb")
ti2 = FactoryGirl.create(:tag_implication, :antecedent_name => "ccc", :consequent_name => "ddd") ti2 = FactoryGirl.create(:tag_implication, :antecedent_name => "ccc", :consequent_name => "ddd")
ti1.reload
ti2.reload
ti2.update_attributes( ti2.update_attributes(
:antecedent_name => "bbb" :antecedent_name => "bbb"
) )
@@ -76,18 +78,29 @@ class TagImplicationTest < ActiveSupport::TestCase
assert_equal("ddd", ti2.descendant_names) assert_equal("ddd", ti2.descendant_names)
end 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") ti1 = FactoryGirl.create(:tag_implication, :antecedent_name => "aaa", :consequent_name => "bbb")
ti2 = FactoryGirl.create(:tag_implication, :antecedent_name => "bbb", :consequent_name => "ccc") ti2 = FactoryGirl.create(:tag_implication, :antecedent_name => "xxx", :consequent_name => "bbb")
ti3 = FactoryGirl.create(:tag_implication, :antecedent_name => "ccc", :consequent_name => "ddd") ti3 = FactoryGirl.create(:tag_implication, :antecedent_name => "bbb", :consequent_name => "ccc")
ti2.destroy ti4 = FactoryGirl.create(:tag_implication, :antecedent_name => "ccc", :consequent_name => "ddd")
ti1.reload ti1.reload
ti2.reload
ti3.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("bbb", ti1.descendant_names)
assert_equal("ddd", ti3.descendant_names) assert_equal("bbb", ti2.descendant_names)
assert_equal("ddd", ti4.descendant_names)
end 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 = FactoryGirl.create(:tag_implication, :antecedent_name => "aaa", :consequent_name => "bbb")
ti1.reload ti1.reload
assert_equal("active", ti1.status) assert_equal("active", ti1.status)
@@ -117,6 +130,18 @@ class TagImplicationTest < ActiveSupport::TestCase
assert_equal("ccc ddd eee", ti2.descendant_names) assert_equal("ccc ddd eee", ti2.descendant_names)
assert_equal("ddd", ti3.descendant_names) assert_equal("ddd", ti3.descendant_names)
assert_equal("eee", ti4.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 end
should "update any affected post upon save" do should "update any affected post upon save" do