У меня есть таблица 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]]
Проблема в том, что он, похоже, не фильтрует недоступные варианты.