after_save callback of act_as_nested_set model lead to SystemStackError
up vote
1
down vote
favorite
I am using Rails 5.1.6
I have a model called Taxon
using acts_as_nested_set
. I have 4 levels of Taxons, the last level sub_category
has an attribute holding names of all parents, I want to update the sub_category
attribute every time any of its parents name is changed, when using after_save
callback it runs into SystemStackError
as each after save callback is run for each child leading to infinite loop. Any idea how to overcome this issue?
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
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
ruby-on-rails ruby callback ruby-on-rails-5.1 nested-sets
add a comment |
up vote
1
down vote
favorite
I am using Rails 5.1.6
I have a model called Taxon
using acts_as_nested_set
. I have 4 levels of Taxons, the last level sub_category
has an attribute holding names of all parents, I want to update the sub_category
attribute every time any of its parents name is changed, when using after_save
callback it runs into SystemStackError
as each after save callback is run for each child leading to infinite loop. Any idea how to overcome this issue?
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
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
ruby-on-rails ruby callback ruby-on-rails-5.1 nested-sets
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
I am using Rails 5.1.6
I have a model called Taxon
using acts_as_nested_set
. I have 4 levels of Taxons, the last level sub_category
has an attribute holding names of all parents, I want to update the sub_category
attribute every time any of its parents name is changed, when using after_save
callback it runs into SystemStackError
as each after save callback is run for each child leading to infinite loop. Any idea how to overcome this issue?
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
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
ruby-on-rails ruby callback ruby-on-rails-5.1 nested-sets
I am using Rails 5.1.6
I have a model called Taxon
using acts_as_nested_set
. I have 4 levels of Taxons, the last level sub_category
has an attribute holding names of all parents, I want to update the sub_category
attribute every time any of its parents name is changed, when using after_save
callback it runs into SystemStackError
as each after save callback is run for each child leading to infinite loop. Any idea how to overcome this issue?
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
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
ruby-on-rails ruby callback ruby-on-rails-5.1 nested-sets
ruby-on-rails ruby callback ruby-on-rails-5.1 nested-sets
edited Nov 11 at 14:24
vnbrs
1,0691722
1,0691722
asked Nov 11 at 11:50
Selim Alawwa
225
225
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
0
down vote
accepted
I have a solution that will work for you but I do not think it is an elegant one but here you go and then you can fine tune it:
In your model:
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.skip_callbacks = true # disable the after_save callback so that you do not end up in infinite loop (stackoverflow)
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
Thanks that helps!
– Selim Alawwa
Nov 11 at 14:10
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
accepted
I have a solution that will work for you but I do not think it is an elegant one but here you go and then you can fine tune it:
In your model:
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.skip_callbacks = true # disable the after_save callback so that you do not end up in infinite loop (stackoverflow)
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
Thanks that helps!
– Selim Alawwa
Nov 11 at 14:10
add a comment |
up vote
0
down vote
accepted
I have a solution that will work for you but I do not think it is an elegant one but here you go and then you can fine tune it:
In your model:
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.skip_callbacks = true # disable the after_save callback so that you do not end up in infinite loop (stackoverflow)
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
Thanks that helps!
– Selim Alawwa
Nov 11 at 14:10
add a comment |
up vote
0
down vote
accepted
up vote
0
down vote
accepted
I have a solution that will work for you but I do not think it is an elegant one but here you go and then you can fine tune it:
In your model:
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.skip_callbacks = true # disable the after_save callback so that you do not end up in infinite loop (stackoverflow)
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
I have a solution that will work for you but I do not think it is an elegant one but here you go and then you can fine tune it:
In your model:
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.skip_callbacks = true # disable the after_save callback so that you do not end up in infinite loop (stackoverflow)
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
answered Nov 11 at 14:09
Tarek N. Elsamni
1,2591712
1,2591712
Thanks that helps!
– Selim Alawwa
Nov 11 at 14:10
add a comment |
Thanks that helps!
– Selim Alawwa
Nov 11 at 14:10
Thanks that helps!
– Selim Alawwa
Nov 11 at 14:10
Thanks that helps!
– Selim Alawwa
Nov 11 at 14:10
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53248454%2fafter-save-callback-of-act-as-nested-set-model-lead-to-systemstackerror%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown