J'ai d'abord été troublé par les termes purchase
et sale
. Mais votre mise à jour, je crois, m'a aidé à mieux comprendre le problème.
Donc, ce que j'ai compris, c'est que tout ce qui n'est pas vendu correspond aux achats moins les ventes. Ce qui suit devrait vous donner cette liste :
scope :unsold, lambda {includes(:sale).select { |p| !p.sale.present? } }
Mise à jour :
Une brève explication de ce qui se passe ici :
La portée ne fait pas vraiment tout le travail dans la base de données. Il effectue d'abord une sélection SQL de tous les achats, y compris la vente jointe. Cela vous donne tous les enregistrements de vos purchases
table. Ensuite, cette portée revient à Ruby Array
sur le select
méthode. La méthode retourne tous les achats p
sans sale
ce qui se fait en annulant les achats avec la vente.
J'espère que cela clarifie un peu ce que fait le champ d'application.
Mise à jour 2 :
Un scope chainable !
scope :unsold, lambda { where('id not in (?)', Sale.pluck(:linked_indent_id)) }
Dans cette portée, le id
s d'Achats qui ne sont pas en Sale
linked_indent_id
de sont sélectionnés.