Eager loading :self_and_ancestors breaks :ancestry_path
dup2 opened this issue · 1 comments
For an AR model VirtualPath used for a DB based file system, we use this excellent gem.
When loading a bunch of the models after applying access control and other restrictions, we build up the hierarchy for a recursive "ls" style output and use ancestry_path for the parts.
To speed up loading the ancestors, we try to use eager loading:
However, this mixes up the order of the ancestry path elements.
Example queries and output:
irb(main):063:0> VirtualPath.limit(4).map(&:ancestry_path)
=> [["Root"], ["Root", "FunnyFolder-1"], ["Root", "FunnyFolder-2"], ["Root", "FunnyFolder-2", "Funny-Sub-2"]]irb(main):064:0> VirtualPath.limit(4).eager_load(:self_and_ancestors).map(&:ancestry_path)
=> [["Root"], ["FunnyFolder-1", "Root"], ["FunnyFolder-2", "Root"], ["Funny-Sub-2", "FunnyFolder-2", "Root"]]Any solutions to this? Other users seem to cache the ancestry_path for speeding up this use case..
Can't this be done with AR queries only?
It seems that the ordering is lost when doing eager_load and the method ancestory_path relies on this order.
Using .eager_load(:self_and_ancestors).order("virtual_path_hierarchies.generations" => :asc) seems to fix this.
Any clue why this is the case?