fixes #1473
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user