El includes
El método de AREL elegirá entre dos estrategias para realizar la consulta, una de las cuales simplemente realiza dos consultas distintas y la otra realiza un INNER JOIN. En ambos casos los productos serán distintos.
Tienes que hacer manualmente una combinación externa derecha:
Product.joins('RIGHT JOIN categories ON categories.product_id = products.id').where(categories: { id: @my_product.categories.pluck(:id) } )
añade también .preload(:categories)
si quieres mantener la carga ansiosa de las categorías.