PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Escopo para uma associação opcional has_one consigo mesmo


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.