Najpierw pomyliłem się z terminami purchase
i sale
. Ale uważam, że twoja aktualizacja pomogła mi lepiej zrozumieć problem.
Więc zrozumiałem, że wszystko, co nie zostało sprzedane, to zakupy minus sprzedaż. Poniższa lista powinna dać ci tę listę:
scope :unsold, lambda {includes(:sale).select { |p| !p.sale.present? } }
Aktualizacja:
Krótkie wyjaśnienie tego, co się tutaj dzieje:
Zakres tak naprawdę nie wykonuje całej pracy w bazie danych. Wykonuje selekcję SQL wszystkich zakupów, w tym najpierw dołączoną sprzedaż. To daje ci wszystkie rekordy w twoich purchases
stół. Następnie ten zakres wraca do Rubiego Array
na select
metoda. Metoda zwraca wszystkie zakupy p
bez sale
co odbywa się poprzez negowanie zakupów ze sprzedażą.
Mam nadzieję, że to wyjaśnia nieco, co robi zakres.
Aktualizacja 2:
Zakres, który można połączyć w łańcuch!
scope :unsold, lambda { where('id not in (?)', Sale.pluck(:linked_indent_id)) }
W tym zakresie id
s zakupów, których nie ma w Sale
linked_indent_id
są zaznaczone.