Nejprve mě zmátly pojmy purchase a sale . Ale věřím, že vaše aktualizace mi pomohla lépe porozumět problému.
Takže jsem pochopil, že vše, co se neprodalo, jsou nákupy mínus prodeje. Následující seznam by vám měl poskytnout tento seznam:
scope :unsold, lambda {includes(:sale).select { |p| !p.sale.present? } }
Aktualizace:
Stručné vysvětlení toho, co se zde děje:
Rozsah ve skutečnosti nevykonává veškerou práci v databázi. Nejprve provede SQL výběr všech nákupů včetně spojeného prodeje. Získáte tak všechny záznamy ve vašich purchases stůl. Pak tento rozsah spadá zpět do Ruby Array na select metoda. Metoda vrací všechny nákupy p bez sale což se provádí negací nákupů s prodejem.
Doufám, že to trochu objasní, co rozsah dělá.
Aktualizace 2:
Rozsah, který lze řetězit!
scope :unsold, lambda { where('id not in (?)', Sale.pluck(:linked_indent_id)) }
V tomto rozsahu id s nákupů, které nejsou v Sale linked_indent_id jsou vybrány.