What used to be done as
```sql
SELECT "order_cycles".* FROM "order_cycles"
WHERE (order_cycles.orders_open_at <= '2019-07-29 17:45:20.137294'
AND order_cycles.orders_close_at >= '2019-07-29 17:45:20.137333')
SELECT DISTINCT "enterprises".* FROM "enterprises"
INNER JOIN "exchanges" ON "enterprises"."id" = "exchanges"."receiver_id"
WHERE "exchanges"."order_cycle_id" = 1
AND "exchanges"."incoming" = 'f'
(...)
SELECT DISTINCT "enterprises".* FROM "enterprises"
INNER JOIN "exchanges" ON "enterprises"."id" = "exchanges"."receiver_id"
WHERE "exchanges"."order_cycle_id" = 4
AND "exchanges"."incoming" = 'f'
```
it became
```sql
SELECT "order_cycles".* FROM "order_cycles"
WHERE (order_cycles.orders_open_at <= '2019-07-29 17:45:20.137294'
AND order_cycles.orders_close_at >= '2019-07-29 17:45:20.137333')
SELECT "exchanges".* FROM "exchanges"
WHERE "exchanges"."incoming" = 'f'
AND "exchanges"."order_cycle_id" IN (1, 2, 3, 4)
SELECT "enterprises".* FROM "enterprises"
WHERE "enterprises"."id" IN (3, 4, 5, 6)
```
I haven't got any perf numbers yet but each of the N+1 queries took as
long as the single `enterprises` query on my dev machine.
This should have a noticeable perf impact since the changed method
belongs to the `BaseController` seems to be executed in all HTML
requests as it gets called by
```ruby
before_filter :warn_invalid_order_cycles, if: :html_request?
```
Set master variant price in products controller
Code climate tidy up
Syntax improvement
Revert "Remove non-functional Price field from Edit Product screen"
This reverts commit 585072302c.
Syntax improvement
fixing revert
Revert "Remove non-functional Price field from Edit Product screen"
This reverts commit 585072302c.
fixing conflicts
Spree 2.0 keeps shipping fee adjustments open unless they are manually
closed. But open adjustments cannot be edited.
To preserve updates, like changing the amount of the shipping fee
we close the adjustment first.
Note that, as explained in
https://apidock.com/rails/v3.2.13/ActiveRecord/Relation/delete, `delete` does
not trigger callbacks and so it skips the products cache logic.
If we still want to avoid instantiating the AR object, we need to explicitly
call that logic for the cache to be up-to-date.
The admin variants controller create action is adapted (same as in the admin ProductsController). This is necessary because variant.on_hand and on_demand cannot be mass assigned on creation in v2, see VariantStock for more details.
For now we are hiding the new stock management page that comes in spree v2 as we don't need the complexity added by the management of stock per stock location (only one stock location in ofn v2 for now)
This separates logic for bang and non-bang versions of
Spree::Order#next.
The different conditions used in both methods (state == "completed" vs
order.completed?) have implications in whether a transition is attempted
or not.
This keeps the override of Spree's model leaner. More importantly, it
prepares us for using `destroy` instead of `delete`.
In the past, `Product#delete` soft-deleted the product, but didn't
delete the variants. When we use `Product#destroy` to soft-delete the
product, it will also call destroy on the variants. If the model doesn't
allow the deletion of the last variant, it will fail. So when a product
is deleted we want to allow the deletion of all variants. But the user
should not be allowed to delete the last variant. That's why I'm moving
the check to the controller level.
Related commits:
- e6c7acdff3
- 2b47c9145a
- b9f19d5777 (diff-412c5af2ec1ba9f6643f6df5a673c1d4R105)