Primeiro fiquei confuso com os termos
purchase e sale . Mas sua atualização, acredito, me ajudou a entender melhor o problema. Então o que eu entendi é que qualquer coisa não vendida são compras menos vendas. A seguir deve dar-lhe essa lista:
scope :unsold, lambda {includes(:sale).select { |p| !p.sale.present? } }
Atualização:
Uma breve explicação do que está acontecendo aqui:
O escopo realmente não faz todo o trabalho no banco de dados. Ele faz uma seleção SQL de todas as compras, incluindo a venda conjunta primeiro. Isso fornece todos os registros em suas
purchases tabela. Então este escopo volta para Ruby Array no select método. O método retorna todas as compras p sem uma sale que é feito negando compras com venda. Espero que isso esclareça um pouco o que o escopo está fazendo.
Atualização 2:
Um escopo que pode ser encadeado!
scope :unsold, lambda { where('id not in (?)', Sale.pluck(:linked_indent_id)) }
Neste escopo, o
id s de Compras que não estão em Sale 's linked_indent_id são selecionados.