Применить область для ассоциации на Rails - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть таблица products и product_variants, которая имеет отношение has_many с products

Я хочу получить все доступные продукты и их варианты.

Модель Product:

class Product < ApplicationRecord
  scope :only_enabled,   -> { where(status: :enabled) }
  scope :only_in_stock,  -> { where('quantity > 0') }
  scope :only_available, -> { only_enabled.only_in_stock }
end

и модель ProductVariant:

class ProductVariant < ApplicationRecord
  scope :only_enabled,   -> { where(status: :enabled) }
  scope :only_in_stock,  -> { where('inventory_quantity > 0') }
  scope :only_available, -> { only_enabled.only_in_stock }
end

Как я могу получить все Product.only_available с его ProductVariant.only_available, не исключая продукты, если варианты не соответствуют области действия ProductVariant.only_available?

Я пытался использовать этот запрос:

@store.products.only_available.joins(:category).joins('LEFT JOIN product_variants ON product_variants.product_id = products.id AND product_variants.status = 1 AND product_variants.inventory_quantity > 0')
Product Load (4.4ms)  SELECT "products".* FROM "products" INNER JOIN "categories" ON "categories"."id" = "products"."category_id" LEFT JOIN product_variants ON product_variants.product_id = products.id AND product_variants.status = 1 WHERE "products"."store_id" = $1 AND "products"."status" = $2 AND (quantity > 0) ORDER BY "products"."name" ASC  [["store_id", "129031"], ["status", 1]]

Проблема в том, что он, похоже, не фильтрует недоступные варианты.

1 Ответ

0 голосов
/ 30 апреля 2018

Я использовал where для фильтрации ассоциации.

@store.products.only_available
  .eager_load(:product_variants)
  .where('product_variants IS NULL OR (product_variants.status = 1 AND product_variants.inventory_quantity > 0)')

Я должен был сделать это association IS NULL OR ( ... ), чтобы все заработало так, как я ожидал.

...