Donc, la réponse à la question d'origine, pouvez-vous joindre des portées avec 'ou' au lieu de 'et' semble être "non, vous ne pouvez pas". Mais vous pouvez coder manuellement une portée ou une requête complètement différente qui fait le travail, ou utiliser un cadre différent d'ActiveRecord, par exemple MetaWhere ou Squeel. Pas utile dans mon cas
Je suis 'or' une portée générée par pg_search, qui fait un peu plus que sélectionner, elle inclut la commande par ASC, ce qui fait le désordre d'une union propre. Je veux le 'ou' avec une portée artisanale qui fait des choses que je ne peux pas faire dans pg_search. J'ai donc dû le faire comme ça.
Product.find_by_sql("(#{Product.code_starts_with('Tom').to_sql}) union (#{Product.name_starts_with('Tom').to_sql})")
C'est à dire transformer les portées en sql, mettre des crochets autour de chacun d'eux, les unir ensemble, puis find_by_sql en utilisant le sql généré. C'est un peu nul, mais ça marche.
Non, ne me dites pas que je peux utiliser "against: [: name,: code]" dans pg_search, j'aimerais le faire comme ça, mais le champ 'name' est un hstore, que pg_search ne peut pas gérer encore. Ainsi, la portée par nom doit être fabriquée à la main puis fusionnée avec la portée pg_search.