Entonces, la respuesta a la pregunta original, ¿puede unir ámbitos con 'o' en lugar de 'y' parece ser "no, no puede". Pero puede codificar manualmente un alcance o consulta completamente diferente que haga el trabajo, o usar un marco diferente de ActiveRecord, por ejemplo, MetaWhere o Squeel. No es útil en mi caso
Estoy 'o' creando un alcance generado por pg_search, que hace un poco más que seleccionar, incluye el orden de ASC, lo que hace un desastre de una unión limpia. Quiero 'o' con un alcance artesanal que hace cosas que no puedo hacer en pg_search. Así que tuve que hacerlo así.
Product.find_by_sql("(#{Product.code_starts_with('Tom').to_sql}) union (#{Product.name_starts_with('Tom').to_sql})")
Es decir, convertir los ámbitos en sql, poner corchetes alrededor de cada uno, unirlos y luego find_by_sql utilizando el sql generado. Es un poco basura, pero funciona.
No, no me digas que puedo usar "contra: [: nombre,: código]" en pg_search, me gustaría hacerlo así, pero el campo 'nombre' es un hstore, que pg_search no puede manejar todavía. Por lo tanto, el alcance por nombre debe ser diseñado a mano y luego unido con el alcance pg_search.