Простая форма поиска не работает в рельсах - PullRequest
0 голосов
/ 10 января 2020

Я слежу за Railscast: http://railscasts.com/episodes/37-simple-search-form?autoplay=true

Результат хорошо видно в моей реализации. Но так как у меня есть столбцы first_name и last_name вместо просто «name», как в примере выше, мне нужен способ поиска обоих, независимо от того, что является поисковым термином. Как я могу это сделать? Прямо сейчас работает только поиск по имени.

user.rb

  def self.search(search)
    if search
      where('first_name LIKE :search OR last_name LIKE :search', search: "%#{search}%")
    else
      all
    end
  end

people_controller, функция индекса:

@users = User.search(params[:search])

index. html .erb (для людей контроллер):

    <%= form_tag people_path, :method => 'get' do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag("Search users", first_name: nil, last_name: nil) %>
  </p>
    <% end %>

  <ul>
  <% @users.each do |user| %>
    <li>
      <%= link_to profiles_path(user_id: user.id) do %>
        <%= user.first_name %> 
        <%= user.last_name %>
      <% end %>
    </li>
  <% end %>
  </ul>

ОБНОВЛЕНИЕ:

Так что это странно. У меня 4 пользователя. Для первых 3 работает только поиск по имени. Фамилия или полное имя (или частичное имя) не. Для последнего пользователя работает только поиск по фамилии.

... что может происходить? Только что сделал еще трех пользователей и протестировал. Первого нового пользователя искали только по имени. Второго нового пользователя искали только по фамилии. Его имя является частью фамилии 3-го пользователя, и это 3-е исходное имя пользователя было возвращено при поиске по имени нового пользователя (... почему? Раньше не работало так; частичный поиск по имени не работает для других пользователей). И была найдена только фамилия третьего пользователя.

ОБНОВЛЕНИЕ:

ОК, ничего не сделал. Но теперь пользователя первого оригинала ищут по фамилии или имени (только имя раньше). ПОЧЕМУ? Второй оригинальный пользователь. И частичный поиск для двух пользователей теперь работает. ПОЧЕМУ? И последний новый пользователь, чья фамилия (только) была доступна для поиска, теперь не может быть найден никем. ПОЧЕМУ?

И только что повторил попытку и вернулся к предыдущему, с возможностью поиска только по имени, без частичного поиска и т. Д. c. Почему это постоянно меняется? Как сделать так, чтобы поисковый запрос просто выполнял поиск по имени, фамилии или по обоим параметрам?

ОБНОВЛЕНИЕ:

Я получил ответ (на выше, а не в целом). Поиск является чувствительным к делу. Теперь мой вопрос: как я могу сделать так, чтобы в нем не учитывался регистр и чтобы работал поисковый термин, включающий как имя, так и фамилию (например, «Том Полсон»)? (сейчас только поиск любой из этих работ)

ОБНОВЛЕНИЕ:

Поэтому я решил проблему чувствительности к регистру, изменив LIKE на ILIKE. Я использую Postgres.

Если бы вы могли помочь с поиском как имени, так и фамилии, я был бы признателен за это!

ОБНОВЛЕНИЕ:

Так что я сейчас использую это для поиска оба или либо имя и фамилия. Но сейчас частичный поиск не работает. Есть ли способ заставить это работать здесь?

      where("first_name ilike :search or last_name ilike :search or first_name || ' ' || last_name ilike :search", search: "%#{search}")

ОБНОВЛЕНИЕ:

Решено, добавив% к% # {search} %#{search}%

Дело, похоже, решено. Спасибо! Возможно, я отправлю ответ позже.

1 Ответ

0 голосов
/ 10 января 2020

UPDATE: ооо, вы хотели искать в обоих столбцах. Одним из способов является использование «Concat». при условии, что вы поставили пробел между именем и фамилией:

where("CONCAT(first_name, ' ', last_name ) ILIKE ?","%#{search}%")

ПЕРВЫЙ ОТВЕТ:

def self.search(search)
    if search
      buff=search.downcase
      where('lower(first_name) LIKE ? OR lower(last_name) LIKE ?', "%#{buff}%", "%#{buff}%")

должно работать.

или ILIKE, если вы предпочитаете.

where('first_name ILIKE ? OR last_name ILIKE ?', "%#{search}%", "%#{search}%")

Вы можете проверить значение 'params [: search]' если это не ноль?

...