collectiveidea/awesome_nested_set

Getting common ancestors / merging ancestors

Opened this issue · 1 comments

Hello!

I have a case in which i have multiple sets of self_and_ancestors results. The amount of these sets depends on the variable which makes it unpredictable and N+1 prone therefore i was looking for some ways of simplifying that with one query. Let's say my code looks as follows:

taxons = []

product.taxons.each do |taxon|
  taxon.self_and_ancestors.each { |t| taxons << t }
end

Which obviously produces new query for each self_and_ancestors call. So if there are 100 product.taxons, 100 queries will be produced.

I was experimenting with doing that with merge:

collection = Spree::Taxon.all
product.taxons.each do |taxon|
  collection.merge!(taxon.self_and_ancestors)
end

which indeed produced one single query but it operates on lft and rgt columns and i have no idea if that's proper way of handling that and/or this produced sql query is valid. In fact, it merged where statements for all of the self_and_ancestors calls.

For your convenience, i prepared an example for you. Let's say product.taxons returns two taxons. Here are the sql queries produced for each one of them:

product.taxons.first.self_and_ancestors.to_sql
# => SELECT "spree_taxons".* FROM "spree_taxons" WHERE "spree_taxons"."lft" <= 1 AND "spree_taxons"."rgt" >= 232 ORDER BY lft

product.taxons.last.self_and_ancestors.to_sql
# => SELECT "spree_taxons".* FROM "spree_taxons" WHERE "spree_taxons"."lft" <= 201 AND "spree_taxons"."rgt" >= 202 ORDER BY lft                                                                                     

And here is the result of merging them:

collection = Spree::Taxon.all
product.taxons.each do |taxon|
  collection.merge!(taxon.self_and_ancestors)
end
collection.to_sql
# => SELECT "spree_taxons".* FROM "spree_taxons" WHERE "spree_taxons"."lft" <= 201 AND "spree_taxons"."rgt" >= 202 ORDER BY lft

Does that look valid to you? Is that how i should approach that?

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.