spree-contrib / spree_related_products

Related products extension for Spree Commerce.

Home Page:http://guides.spreecommerce.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Product method missing of this gem causes n+1 query unintentionally

channainfo opened this issue · comments

I ty to fetch 4 (top) products per selected taxon to show on my website feed. You can see the gist here:

https://gist.github.com/channainfo/175196541df06db41da3d50eef13379e

On line 32 I get the taxon_id from the active relation which result in the Spree::Product
https://gist.github.com/channainfo/175196541df06db41da3d50eef13379e#file-feed_taxon_product-rb-L32

causes spree_related_products to fire method_missing eventually trigger undesired queries as below:

  Spree::RelationType Load (0.4ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]
  Spree::RelationType Load (0.3ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]
  Spree::RelationType Load (0.2ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]
  Spree::RelationType Load (0.2ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]
  Spree::RelationType Load (0.2ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]
  Spree::RelationType Load (0.4ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]
  Spree::RelationType Load (0.2ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]
  Spree::RelationType Load (0.1ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]
  Spree::RelationType Load (0.1ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]
  Spree::RelationType Load (0.2ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]
  Spree::RelationType Load (0.1ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]
  Spree::RelationType Load (0.1ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]
  Spree::RelationType Load (0.1ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]
  Spree::RelationType Load (0.1ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]
  Spree::RelationType Load (0.2ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]
  Spree::RelationType Load (0.3ms)  SELECT "spree_relation_types".* FROM "spree_relation_types" WHERE "spree_relation_types"."applies_to" = $1 ORDER BY "spree_relation_types"."name" ASC  [["applies_to", "Spree::Product"]]

To work around to avoid triggering spree_related products method missing, online 32 I had to do this

# taxon_product.taxon_id == taxon.id
taxon_product.read_attribute_before_type_cast('taxon_id') == taxon.id

There should be a better way to handle this to avoid unwanted performance impact and debuggability
https://github.com/spree-contrib/spree_related_products/blob/master/app/models/spree/product_decorator.rb#L51