Рельсы с вводом токена 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?
Другие альтернативы:
- https://github.com/texticle/texticle
- сохранить строчную версию full_name и выполнить поиск по этому полю
Я не уверен, почему это не совпадает. Может быть, вы должны добавить
' '
вокруг параметра:"first_name like '?'"
Я думаю, у вас должно быть два параметра:
.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 в качестве своей базы данных.