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

Индекс UsersController:

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

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

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

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

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

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

Помощь приветствуется!


person dmonopoly    schedule 02.08.2012    source источник
comment
Какую базу данных вы используете? Возможно (хотя я не знаю, почему это произошло, это противоречит всем документам, которые я могу найти), что символы % в вашем поиске не соответствуют нулевой длине. Это означает, что "%J%" не будет соответствовать именам, начинающимся с J, поскольку ожидает, что перед ним будет другой символ. Соответствует ли ваш запрос буквам, которые являются последним символом в имени?   -  person Dave Isaacs    schedule 13.08.2012
comment
Интересные мысли! Я использую Postgres. Запрос успешно соответствует буквам, которые являются последним символом в имени.   -  person dmonopoly    schedule 13.08.2012
comment
Если вы можете сопоставить последнюю букву имени, то мое предложение, вероятно, НЕ является причиной проблемы. Но вы можете попробовать удалить первый % из предложения where, просто чтобы посмотреть, что произойдет.   -  person Dave Isaacs    schedule 13.08.2012


Ответы (3)


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

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

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

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

person Jesse Wolgamott    schedule 13.08.2012
comment
Это сработало - спасибо! Я также хотел бы поблагодарить @davidrac ниже за помощь по # 2. - person dmonopoly; 14.08.2012

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

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

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

person davidrac    schedule 02.08.2012
comment
1 не годится - ставить "вокруг"? просто не дает поиску работать. Однако 2 отлично работает - спасибо за это! (Если у вас когда-нибудь появится другая идея для 1, дайте мне знать) - person dmonopoly; 02.08.2012

Причина, по которой первая буква не обнаруживается, заключается в том, что у вас есть% перед столбцами имени и фамилии в операторе 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 не индексируются для передних и задних операций (только передних). Предполагается, что вы используете MySQL в качестве серверной части БД.

person matsko    schedule 13.08.2012