Il includes
il metodo di AREL sceglierà tra due strategie per eseguire la query, una delle quali esegue semplicemente due query distinte e l'altra esegue un INNER JOIN. In entrambi i casi i prodotti saranno distinti.
Devi fare manualmente un join esterno destro:
Product.joins('RIGHT JOIN categories ON categories.product_id = products.id').where(categories: { id: @my_product.categories.pluck(:id) } )
aggiunge anche .preload(:categories)
se vuoi mantenere il caricamento ansioso delle categorie.