私は最初、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
が選択されています。