This totally removes the following N+1 query from the GET /shops request
```sql
SELECT "spree_properties".* FROM "spree_properties"
INNER JOIN "spree_product_properties"
ON "spree_product_properties"."property_id" = "spree_properties"."id"
INNER JOIN "spree_products"
ON "spree_products"."id" = "spree_product_properties"."product_id"
INNER JOIN "enterprises"
ON "enterprises"."id" = "spree_products"."supplier_id"
WHERE "spree_products"."supplier_id" = 24;
```
The product properties of the corresponding enterprises are now loaded
in a single query fired from the controller.
This totally removes the following N+1 query from the GET /shops request
```sql
SELECT "spree_properties".* FROM "spree_properties"
INNER JOIN "producer_properties"
ON "spree_properties"."id" = "producer_properties"."property_id"
WHERE "producer_properties"."producer_id" = 17
ORDER BY producer_properties.position;
```
The producer properties of the corresponding enterprises are now loaded
in a single query fired from the controller.
This may lead to more error reports than we want to see. A not existing
email address may cause Bugsnag to be notified. If this happens, we can
rescue form these specific errors and only report the rest.
The most common failure would happen when sending the confirmation email
triggered by `user.save`. We rescue any errors here and give feedback to
the user.
This allows for immediate feedback when the user types an email address
that is not accepted by our mail server or the email setup is not
configured properly.
The route and controller were in the main app and the views in the engine, with this commit they stay all inside the engine
This is done to keep it simple and remove the unnecessary dependency between main app and engine
If we use this mechanism in the future for other things in the main app or other engines, we can find a way to extract/abstract this
We can't always rely on other parts of the code been loaded first. We
need to declare dependencies so that they are always present.
I just ran into this problem in my dev environment.