PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Portée d'une association facultative has_one avec lui-même

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.