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.