Jag blev först förvirrad av termerna purchase och sale . Men din uppdatering tror jag hjälpte mig att förstå problemet mer.
Så vad jag förstod är allt osålt är köp minus försäljning. Följande bör ge dig den listan:
scope :unsold, lambda {includes(:sale).select { |p| !p.sale.present? } }
Uppdatering:
En kort förklaring av vad som händer här:
Omfattningen gör inte riktigt allt arbete i databasen. Den gör ett SQL-val av alla inköp inklusive den sammanslagna försäljningen först. Detta ger dig alla uppgifter i dina purchase tabell. Sedan faller detta omfång tillbaka till Ruby Array på select metod. Metoden returnerar alla köp p utan en sale vilket görs genom att förneka köp med försäljning.
Hoppas detta klargör vad omfattningen gör lite.
Uppdatering 2:
Ett kikarsikte som är kedjebart!
scope :unsold, lambda { where('id not in (?)', Sale.pluck(:linked_indent_id)) }
I detta omfång är id s av köp som inte finns i Sale s linked_indent_id är valda.