Полнотекстовый поиск - это действительно то, что вам нужно для вашего варианта использования.
Вы можете рассмотреть возможность использования Elasticsearch, который очень легко настроить с помощью Searchkick gem .
Другим вариантом для более сложного поиска, который не требует отдельного поискового индекса, будет Ransack gem .
Но чтобы ответить на ваш конкретный вопрос, я предлагаю определить метод класса в модели вашего продукта, который преобразует поисковый термин в массив строк, а затем выполняет поиск, что-то вроде:
def self.by_name_or_category(search)
return None unless search.present?
keywords = search.split(' ').map {|k| "%#{k}%" }
where('name ilike any ( array[?] )', keywords)
.or(Product.where('category ilike any ( array[?] )', keywords))
end