Cette expression :
to_tsvector('simple', (COALESCE(title::TEXT), ''))
n'est pas sargable par rapport à votre index.
Vous devez déclarer l'index sur exactement l'expression utilisée dans la requête :
CREATE INDEX products_gin_title
ON products
USING GIN(to_tsvector('simple', COALESCE(title::TEXT,'')))
(ou faites en sorte que ruby génère l'expression qui est utilisée dans l'index).
Si vous souhaitez que plusieurs colonnes soient indexées, il vous suffit de les concaténer :
CREATE INDEX products_gin_title
ON products
USING GIN(to_tsvector('simple', title || ' ' || product_type || ' ' || platform_id))
mais encore une fois, Ruby devrait filtrer exactement la même expression pour que l'index soit utile.