Рельсы с вводом токена jquery: первый символ игнорируется при поиске

Индекс UsersController:

@users = current_user.other_users.where("first_name like ?", "%#{params[:q]}%")

1) Поиск отлично работает в текстовом поле, за исключением того, что первый символ не обнаружен.

Пример: если я буду искать "Джон" с помощью "J", я не получу никаких результатов, но если я сделаю "о", я получу "Джон", как и должен.

2) Мне интересно, как вы добавили дополнительное условие поиска для last_name...? Я думал что-то вроде

.where("first_name like ? or last_name like ?", "%#{params[:q]}%")

будет работать, но это не так...

Помощь оценена!

3 ответа

Решение

Держу пари, что вы используете Postgres в качестве базы данных, где в предложениях LIKE учитывается регистр. Для поиска без учета регистра в Postgres:

.where("first_name ILIKE ? or last_name ILIKE ?", "%#{params[:q]}%")

У этого SO много предыстории: как написать запрос без учета регистра для MySQL и Postgres?

Другие альтернативы:

  1. Я не уверен, почему это не совпадает. Может быть, вы должны добавить ' ' вокруг параметра: "first_name like '?'"

  2. Я думаю, у вас должно быть два параметра:

.where ("first_name like? или last_name like?", "%#{params[:q]}%", "%#{params[:q]}%")

Причина, по которой первая буква не обнаруживается, заключается в том, что у вас есть% infront из столбцов имени и фамилии в операторе where. Так как нет ничего позади J тогда вот почему %John% не сработает

Вам нужно будет искать как до, так и после заявлений.

Это будет работать.

q1 = params[:q].to_s + '%'
q2 = '%' + q1
where(["first_name LIKE ? OR last_name LIKE ? OR first_name LIKE ? OR last_name LIKE", q1,q1,q2,q2])

Затем поместите UNIQUE в ваш оператор SQL, чтобы все они были уникальными.

В любом случае, лучше использовать индекс полнотекстового поиска для такого рода вещей, поскольку операции LIKE не индексируются для операций front и back (только front). Предполагается, что вы используете MySQL в качестве своей базы данных.

Другие вопросы по тегам