after_save act_as_nested_set 模型的回调导致 SystemStackError
after_save callback of act_as_nested_set model lead to SystemStackError
我正在使用 Rails 5.1.6
我有一个名为 Taxon
的模型,使用 acts_as_nested_set
。我有 4 个级别的 Taxons,最后一个级别 sub_category
有一个包含所有父级名称的属性,我想在每次更改其父级名称时更新 sub_category
属性,使用 after_save
将它 运行 回调到 SystemStackError
中,因为对于每个导致无限循环的子项,保存后的每个回调都是 运行 。知道如何解决这个问题吗?
class Taxon
acts_as_nested_set dependent: :destroy
def update_tree_name
if shop_sub_category?
update(display_tree_name: beautiful_name)
else
related_sub_categories = tree_list.select{ |taxon| taxon.kind == "sub_category" }
related_sub_categories.each do |t|
t.update(display_tree_name: t.beautiful_name)
end
end
end
def beautiful_name
"#{parent.parent.parent.name} -> #{parent.parent.name} -> #{parent.name}-> #{name}"
end
我有一个适合你的解决方案,但我认为它不是一个优雅的解决方案,但你可以开始,然后你可以对其进行微调:
在您的模型中:
class Taxon < ActiveRecord::Base
cattr_accessor :skip_callbacks
after_save :update_tree_name, :unless => :skip_callbacks
end
def update_tree_name
if shop_sub_category?
update(display_tree_name: beautiful_name)
else
related_sub_categories = tree_list.select{ |taxon| taxon.kind == "sub_category" }
Taxon.skip_callbacks = true # disable the after_save callback so that you do not end up in infinite loop (Whosebug)
related_sub_categories.each do |t|
t.update(display_tree_name: t.beautiful_name)
end
Taxon.skip_callbacks = false # enable callbacks again when you finish
end
end
我正在使用 Rails 5.1.6
我有一个名为 Taxon
的模型,使用 acts_as_nested_set
。我有 4 个级别的 Taxons,最后一个级别 sub_category
有一个包含所有父级名称的属性,我想在每次更改其父级名称时更新 sub_category
属性,使用 after_save
将它 运行 回调到 SystemStackError
中,因为对于每个导致无限循环的子项,保存后的每个回调都是 运行 。知道如何解决这个问题吗?
class Taxon
acts_as_nested_set dependent: :destroy
def update_tree_name
if shop_sub_category?
update(display_tree_name: beautiful_name)
else
related_sub_categories = tree_list.select{ |taxon| taxon.kind == "sub_category" }
related_sub_categories.each do |t|
t.update(display_tree_name: t.beautiful_name)
end
end
end
def beautiful_name
"#{parent.parent.parent.name} -> #{parent.parent.name} -> #{parent.name}-> #{name}"
end
我有一个适合你的解决方案,但我认为它不是一个优雅的解决方案,但你可以开始,然后你可以对其进行微调:
在您的模型中:
class Taxon < ActiveRecord::Base
cattr_accessor :skip_callbacks
after_save :update_tree_name, :unless => :skip_callbacks
end
def update_tree_name
if shop_sub_category?
update(display_tree_name: beautiful_name)
else
related_sub_categories = tree_list.select{ |taxon| taxon.kind == "sub_category" }
Taxon.skip_callbacks = true # disable the after_save callback so that you do not end up in infinite loop (Whosebug)
related_sub_categories.each do |t|
t.update(display_tree_name: t.beautiful_name)
end
Taxon.skip_callbacks = false # enable callbacks again when you finish
end
end