私は最初、purchaseという用語に混乱しました。 およびsale 。しかし、あなたのアップデートは私が問題をより理解するのに役立ったと私は信じています。
だから私が理解したのは、売れ残ったものは購入から販売を差し引いたものです。以下にそのリストを示します:
scope :unsold, lambda {includes(:sale).select { |p| !p.sale.present? } }
更新:
ここで起こっていることの簡単な説明:
スコープは、実際にはデータベース内のすべての作業を実行するわけではありません。最初に、参加した販売を含むすべての購入のSQL選択を行います。これにより、purchaseのすべてのレコードが得られます テーブル。次に、このスコープはRuby Arrayにフォールバックします selectで 方法。このメソッドは、すべての購入を返しますp saleなし これは、販売で購入を否定することによって行われます。
これにより、スコープが少し実行していることが明らかになることを願っています。
更新2:
連鎖可能なスコープ!
scope :unsold, lambda { where('id not in (?)', Sale.pluck(:linked_indent_id)) }
このスコープでは、id saleにない購入の のlinked_indent_id が選択されています。