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.