ActiveRecord: найдите родителя, где ни один из детей не соответствует определенному условию - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь использовать Active Record, чтобы найти родителей, у которых ни один из детей не соответствует определенным условиям.

В моем приложении пользователи могут публиковать ставки на элементах .Одна ставка устанавливается в качестве победителя с помощью перечисления status. Я пытаюсь вернуть список предметов, которые не имеют выигрышной ставки.

Вот соответствующий код:

# item.rb
class Item < ApplicationRecord
  has_many :bids
  scope :without_winner, -> { joins(:bids).where.not(bids: { status: :won }) }
end


# bid.rb
class Bid < ApplicationRecord
  belongs_to :item
  enum status: { pending: 0, won: 1, lost: 2 }
end

Моя проблема в том, чтотекущая :without_winner область будет возвращать элемент каждый раз, когда имеет неудавшуюся ставку.Например, если у нас есть два Предмета с тремя Ставками каждый:

Item 1
  Bid 1 (won)
  Bid 2 (lost)
  Bid 3 (lost)

Item 2
  Bid 4 (pending)
  Bid 5 (pending)
  Bid 6 (pending)

Моя текущая область действия :without_winner вернет Предмет 1 дважды и Предмет 2 три раза.Мой желаемый результат будет просто возвращать элемент 2 один раз и вообще не возвращать элемент 1.

Как я могу исправить свою область, чтобы получить список уникальных элементов без выигрышной ставки?

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Вы можете добавить .distinct к своей области, чтобы отсеять дубликаты:

scope :without_winner, -> { joins(:bids).where.not(bids: { status: :won }).distinct }
0 голосов
/ 21 мая 2019

Я давно не использовал прицел, хотя это потрясающий синтаксический сахар. Но если вы действительно застряли, вы можете попробовать метод класса ниже. Это выглядит некрасиво, но хорошо, что он запускает только один запрос и фильтрует в соответствии с вашими требованиями.

class Item < ApplicationRecord
  has_many :bids

  def self.without_winner
    includes(:bids).joins(:bids).distinct.reject do |item|
      item.bids.pluck(:status).include? :won
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...