Узкий ruby запрос, если есть много ассоциаций, подходит для двух разных запросов - PullRequest
1 голос
/ 31 марта 2020

Хорошо, чтобы объяснить это, у меня есть два запроса:

  scope :with_free, lambda {
    variants.joins(:stock)
                .where(
                  stock: { tag: %w[Free] }
                ).distinct
  }

  scope :without_free, lambda {
    variants.joins(:stock)
                .where.not(
                  stock: { tag: %w[Free] }
                ).distinct
  }

Итак, Variant has_many Stocks.

Моя проблема в том, что, например:

Variant 1 имеет две акции, а именно:

  • Stock 1 с тэгом "Free"
  • Stock 2 с тегом «Продажа»

другой вариант, Variant 2, который также имеет 2 акции:

  • Stock 3 с тегом «Свободный»
  • Stock 4 с тэгом "Free"

и Variant 3, который также имеет 2 акции:

  • Stock 3 с тэгом "Sale"
  • Stock 4 с тегом "Продажа"

, когда вызывается with_free, он вернет Variant 1 и Variant 2. Потому что у них есть Stocks с tag: "Free"

, но когда я позвоню without_free, он вернет Variant 1 и Variant 3. Но мой ожидаемый результат при вызове without_free должен быть просто Variant 3, так как Variant 1 имеет запас с tag == "Free", но он также имеет Stock с tag != "Free", поэтому он включен

Я хочу спросить, есть ли способ сделать так, чтобы он проверял все Stocks, и если есть способ с tag == "Free", то он не будет включен в вывод.

Надеюсь, я объяснил это хорошо: (

1 Ответ

1 голос
/ 31 марта 2020

Вы можете сделать область в Акции:

  scope :free, lambda {
      where(tag: %w[Free])
  }

и затем использовать ее в Вариантах:

  scope :without_free, lambda {
    joins(:stocks)
      .where.not(
      stocks:  Stock.free
    ).distinct
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...