Le includes
La méthode d'AREL va choisir entre deux stratégies pour faire la requête, dont l'une fait simplement deux requêtes distinctes et l'autre fait un INNER JOIN. Dans les deux cas les produits seront distincts.
Il faut faire manuellement une jointure externe droite :
Product.joins('RIGHT JOIN categories ON categories.product_id = products.id').where(categories: { id: @my_product.categories.pluck(:id) } )
ajoute aussi .preload(:categories)
si vous souhaitez conserver le chargement rapide des catégories.