PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Bereich für eine optionale has_one-Assoziation mit sich selbst

Zuerst verwirrten mich die Begriffe purchase und sale . Aber ich glaube, Ihr Update hat mir geholfen, das Problem besser zu verstehen.

Ich habe also verstanden, dass alles, was nicht verkauft wird, Einkäufe minus Verkäufe sind. Folgendes sollte Ihnen diese Liste geben:

scope :unsold, lambda {includes(:sale).select { |p| !p.sale.present? } }

Aktualisierung:

Eine kurze Erklärung dessen, was hier passiert:

Der Bereich erledigt nicht wirklich die gesamte Arbeit in der Datenbank. Es führt zuerst eine SQL-Auswahl aller Käufe einschließlich des verbundenen Verkaufs durch. Dadurch erhalten Sie alle Datensätze in Ihren purchases Tisch. Dann fällt dieser Geltungsbereich auf Ruby Array zurück auf select Methode. Die Methode gibt alle Käufe p zurück ohne sale Dies geschieht durch Negieren von Käufen mit Verkauf.

Hoffe, das verdeutlicht ein wenig, was das Oszilloskop tut.

Aktualisierung 2:

Ein Bereich, der verkettet werden kann!

scope :unsold, lambda { where('id not in (?)', Sale.pluck(:linked_indent_id)) }

In diesem Bereich die id s von Käufen, die nicht im Sale sind 's linked_indent_id ausgewählt sind.