So I think we do need both.

Considering a shipment with 4 inventory units from different variant these are the results I get:

Running both (we get a single query and no condition `deleted_at IS NULL`)

```ruby
pry(Spree):1> shipment.inventory_units.joins(:variant).includes(:variant).each { |u| u.variant }
  SQL (1.4ms)  SELECT "spree_inventory_units"."id" AS t0_r0, "spree_inventory_units"."state" AS t0_r1, "spree_inventory_units"."variant_id" AS t0_r2, "spree_inventory_units"."order_id" AS t0_r3, "spree_inventory_units"."shipment_id" AS t0_r4, "spree_inventory_units"."return_authorization_id" AS t0_r5, "spree_inventory_units"."created_at" AS t0_r6, "spree_inventory_units"."updated_at" AS t0_r7, "spree_inventory_units"."pending" AS t0_r8, "spree_variants"."id" AS t1_r0, "spree_variants"."sku" AS t1_r1, "spree_variants"."weight" AS t1_r2, "spree_variants"."height" AS t1_r3, "spree_variants"."width" AS t1_r4, "spree_variants"."depth" AS t1_r5, "spree_variants"."deleted_at" AS t1_r6, "spree_variants"."is_master" AS t1_r7, "spree_variants"."product_id" AS t1_r8, "spree_variants"."cost_price" AS t1_r9, "spree_variants"."position" AS t1_r10, "spree_variants"."cost_currency" AS t1_r11 FROM "spree_inventory_units" INNER JOIN "spree_variants" ON "spree_variants"."id" = "spree_inventory_units"."variant_id" WHERE "spree_inventory_units"."shipment_id" = $1  [["shipment_id", 5]]
=> [#<Spree::InventoryUnit id: 5, state: "on_hand", variant_id: 1, order_id: 5, shipment_id: 5, return_authorization_id: nil, created_at: "2013-09-09 02:33:07", updated_at: "2013-09-09 02:33:07", pending: true>,
 #<Spree::InventoryUnit id: 6, state: "on_hand", variant_id: 6, order_id: 5, shipment_id: 5, return_authorization_id: nil, created_at: "2013-09-09 02:33:07", updated_at: "2013-09-09 02:33:07", pending: true>,
 #<Spree::InventoryUnit id: 8, state: "on_hand", variant_id: 15, order_id: 5, shipment_id: 5, return_authorization_id: nil, created_at: "2013-09-09 02:33:07", updated_at: "2013-09-09 02:33:07", pending: true>,
 #<Spree::InventoryUnit id: 7, state: "on_hand", variant_id: 12, order_id: 5, shipment_id: 5, return_authorization_id: nil, created_at: "2013-09-09 02:33:07", updated_at: "2013-09-09 02:33:07", pending: true>]
```

Using only `joins` (`default_scope` is still ignored but this time we would get one more query for each inventory unit involved):

```ruby
pry(Spree):1> shipment.inventory_units.joins(:variant).each { |u| u.variant }
  Spree::InventoryUnit Load (2.4ms)  SELECT "spree_inventory_units".* FROM "spree_inventory_units" INNER JOIN "spree_variants" ON "spree_variants"."id" = "spree_inventory_units"."variant_id" WHERE "spree_inventory_units"."shipment_id" = $1  [["shipment_id", 5]]
  Spree::Variant Load (1.8ms)  SELECT "spree_variants".* FROM "spree_variants" WHERE "spree_variants"."id" = $1 ORDER BY "spree_variants"."id" ASC LIMIT 1  [["id", 1]]
  Spree::Variant Load (0.7ms)  SELECT "spree_variants".* FROM "spree_variants" WHERE "spree_variants"."id" = $1 ORDER BY "spree_variants"."id" ASC LIMIT 1  [["id", 6]]
  Spree::Variant Load (0.6ms)  SELECT "spree_variants".* FROM "spree_variants" WHERE "spree_variants"."id" = $1 ORDER BY "spree_variants"."id" ASC LIMIT 1  [["id", 15]]
  Spree::Variant Load (0.6ms)  SELECT "spree_variants".* FROM "spree_variants" WHERE "spree_variants"."id" = $1 ORDER BY "spree_variants"."id" ASC LIMIT 1  [["id", 12]]
=> [#<Spree::InventoryUnit id: 5, state: "on_hand", variant_id: 1, order_id: 5, shipment_id: 5, return_authorization_id: nil, created_at: "2013-09-09 02:33:07", updated_at: "2013-09-09 02:33:07", pending: true>,
 #<Spree::InventoryUnit id: 6, state: "on_hand", variant_id: 6, order_id: 5, shipment_id: 5, return_authorization_id: nil, created_at: "2013-09-09 02:33:07", updated_at: "2013-09-09 02:33:07", pending: true>,
 #<Spree::InventoryUnit id: 8, state: "on_hand", variant_id: 15, order_id: 5, shipment_id: 5, return_authorization_id: nil, created_at: "2013-09-09 02:33:07", updated_at: "2013-09-09 02:33:07", pending: true>,
 #<Spree::InventoryUnit id: 7, state: "on_hand", variant_id: 12, order_id: 5, shipment_id: 5, return_authorization_id: nil, created_at: "2013-09-09 02:33:07", updated_at: "2013-09-09 02:33:07", pending: true>]
```

Using only `includes` (fewer queries than when using `joins` only but note this time we see the `default_scope` applied which we really don't want here)

```ruby
pry(Spree):1> shipment.inventory_units.includes(:variant).each { |u| u.variant }
  Spree::InventoryUnit Load (0.9ms)  SELECT "spree_inventory_units".* FROM "spree_inventory_units" WHERE "spree_inventory_units"."shipment_id" = $1  [["shipment_id", 5]]
  Spree::Variant Load (0.9ms)  SELECT "spree_variants".* FROM "spree_variants" WHERE "spree_variants"."deleted_at" IS NULL AND "spree_variants"."id" IN (15, 12, 6, 1)
=> [#<Spree::InventoryUnit id: 8, state: "on_hand", variant_id: 15, order_id: 5, shipment_id: 5, return_authorization_id: nil, created_at: "2013-09-09 02:33:07", updated_at: "2013-09-09 02:33:07", pending: true>,
 #<Spree::InventoryUnit id: 7, state: "on_hand", variant_id: 12, order_id: 5, shipment_id: 5, return_authorization_id: nil, created_at: "2013-09-09 02:33:07", updated_at: "2013-09-09 02:33:07", pending: true>,
 #<Spree::InventoryUnit id: 6, state: "on_hand", variant_id: 6, order_id: 5, shipment_id: 5, return_authorization_id: nil, created_at: "2013-09-09 02:33:07", updated_at: "2013-09-09 02:33:07", pending: true>,
 #<Spree::InventoryUnit id: 5, state: "on_hand", variant_id: 1, order_id: 5, shipment_id: 5, return_authorization_id: nil, created_at: "2013-09-09 02:33:07", updated_at: "2013-09-09 02:33:07", pending: true>]
```