collectiveidea / awesome_nested_set

An awesome replacement for acts_as_nested_set and better_nested_set.
MIT License
2.39k stars 491 forks source link

Set depth at rebuild! #449

Open diesl opened 3 years ago

diesl commented 3 years ago

I added Awesome Nested Set to an existing project where we have (scoped) records that are linked with parent_ids. After setting things up, I triggered a rebuild on the model. So far, so good, lft and rgt were set correctly.

However depth was set to 0 for every record. I also could not find a way to trigger a rebuild for depth (only). Do I miss something here?

My brute force workaround was to loop over all records and set depth to level which was resolved to the correct value.

See also similar tickets #314 and #116 that were closed as stale.

parndt commented 3 years ago

Thanks @diesl - can you please debug this a little on your local? If you use bundle open awesome_nested_set to open the gem in your editor, and put debugging statements (like require 'pry';binding.pry or puts) inside the method compute_level then we can maybe see what the code is thinking about your table.

The relevant method is here https://github.com/collectiveidea/awesome_nested_set/blob/36ec2b072c797be66dd588fbd92780573e3c57c0/lib/awesome_nested_set/model/relatable.rb#L98-L102

stale[bot] commented 3 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

diesl commented 3 years ago

Not stale, I still need to debug

mentalic commented 3 years ago

This is still valid. We ended up doing Category.all.each do |c| c.save;end;0 after rebuild in order to recall the depth.

diesl commented 2 years ago

@parndt Finally I had some time for debugging.

I added a puts statement at the beginning of def compute_level. I did not get any output during Model.rebuild! and after checking the gem code, indeed I do not see any code triggering the computation of the depth during the rebuild:

https://github.com/collectiveidea/awesome_nested_set/blob/36ec2b072c797be66dd588fbd92780573e3c57c0/lib/awesome_nested_set/tree.rb#L18-L28

I would expect that depth is set during rebuild. Do I have some misconception here?


Seems like you already discovered this behavior many years ago:

Yes, I've been noticing this too.. It seems the depth only gets built when you run save or move_to commands.

_Originally posted by @parndt in https://github.com/collectiveidea/awesome_nested_set/issues/116#issuecomment-3694189_

parndt commented 2 years ago

@diesl thanks - I would expect if depth is being used that it gets set during rebuild! so I think that's how it should work (keen for this to be made to happen!)

iainbeeston commented 1 year ago

I just noticed this as well. I've also noticed that calling set_depth_for_self_and_descendants! on the root doesn't calculate the depth correctly either. At the moment my workaround is to call rebuild! followed by set_depth! on each node (which will only work for small numbers of nodes...)