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.