Първо се обърках от термините purchase и sale . Но смятам, че вашата актуализация ми помогна да разбера по-добре проблема.
Това, което разбрах, е, че всичко непродадено е покупки минус продажби. Следното трябва да ви даде този списък:
scope :unsold, lambda {includes(:sale).select { |p| !p.sale.present? } }
Актуализация:
Кратко обяснение на случващото се тук:
Обхватът всъщност не върши цялата работа в базата данни. Първо прави SQL избор на всички покупки, включително присъединената продажба. Това ви дава всички записи във вашите purchases маса. Тогава този обхват се връща към Ruby Array на select метод. Методът връща всички покупки p без sale което се прави чрез отхвърляне на покупки с продажба.
Надяваме се, че това малко изяснява какво прави обхватът.
Актуализация 2:
Обхват, който може да бъде свързан с верига!
scope :unsold, lambda { where('id not in (?)', Sale.pluck(:linked_indent_id)) }
В този обхват id s на покупки, които не са в Sale linked_indent_id на 's са избрани.