The relationship between orders and SKU's is as follows:
- An order has many line items
- A line item belongs to a variant
- A variant has an attribute called SKU
So, lets look at methods of searching.
First I can find an order by using a simple search on order_id:
sandbox » Spree::Order.search(id_eq: 1).result.first.id
(0.1ms) SELECT COUNT(*) FROM "spree_orders" WHERE "spree_orders"."id" = 1
=> 1
That's great. Now I need to find something by a line_item instead of by an order:
sandbox » Spree::Order.search(line_items_id_eq: 1).result.first.id
Spree::Order Load (0.5ms) SELECT "spree_orders".* FROM "spree_orders" LEFT OUTER JOIN "spree_line_items" ON "spree_line_items"."order_id" = "spree_orders"."id" WHERE "spree_line_items"."id" = 1 ORDER BY "spree_orders"."id" ASC LIMIT 1
=> 1
Now I want to find something by a variant_id:
sandbox » Spree::Order.search(line_items_variant_id_eq: 1).result.first.id
Spree::Order Load (0.5ms) SELECT "spree_orders".* FROM "spree_orders" LEFT OUTER JOIN "spree_line_items" ON "spree_line_items"."order_id" = "spree_orders"."id" WHERE "spree_line_items"."variant_id" = 1 ORDER BY "spree_orders"."id" ASC LIMIT 1
=> 1
But instead of searching by variant_id, I want to search by SKU:
Spree::Order.search(line_items_variant_sku_eq: "ROR-00011").result.first.id
Spree::Order Load (0.5ms) SELECT "spree_orders".* FROM "spree_orders" LEFT OUTER JOIN "spree_line_items" ON "spree_line_items"."order_id" = "spree_orders"."id" LEFT OUTER JOIN "spree_variants" ON "spree_variants"."id" = "spree_line_items"."variant_id" AND "spree_variants"."deleted_at" IS NULL WHERE "spree_variants"."sku" = 'ROR-00011' ORDER BY "spree_orders"."id" ASC LIMIT 1
=> 1
So, you can probably use:
<%= f.text_field :line_items_variant_sku_eq %>
to get what you desire.