Расширенный поиск с Rails - PullRequest
0 голосов
/ 26 мая 2018

Я создаю функцию расширенного поиска в своем приложении rails.Я хочу добавить функциональность, где я могу искать и фильтровать на основе имени пользователя и пола.Я сделал это, добавив новую модель под названием модель поиска с двумя столбцами: имя пользователя и пол.Я черпал вдохновение из этого видео и ссылки , но настроил эту функцию так, чтобы она соответствовала моим потребностям.До сих пор все протекало успешно, под этим я подразумеваю, что как администратор страницы я могу успешно перемещаться между двумя индексами разных моделей: моделью пользователей и моделью поиска.Единственная проблема заключается в том, что я пытаюсь захватить мои параметры (что ищется) и сохранить их в контроллере, чтобы их можно было просмотреть в индексе модели поиска.Это мой код для индекса поисковой модели:

<% provide(:title, 'All users') %>
<h1>All users</h1>

<%= will_paginate %>

<%= form_tag searches_path, method: :get do %>
  <%= text_field_tag :username, params[:username] %>
  <%= select_tag :gender, options_for_select(@users.collect{ |u| [u.gender] }) %>
  <%= submit_tag "Search", name: nil %>
<% end %>

<ul class="users">
  <%= render @users %>
</ul>

<%= will_paginate %>

А это search_controller:

  def index
    @search = Search.all
  end

  def new
    @search = Search.new(params[:username])
    @search = Search.new(params[:gender])
  end

  def create
    @search = Search.create(search_params)
    redirect_to @search
  end

  private

  def search_params
    params.require(:search).permit(:users, :gender)
  end

Это индекс моей поисковой модели:

<h1> Your Search Results </h1>

<% if @search.nil? %>
  <p> No Results Found </p>

<% else %>

<ul class="users">
  <%= raise %>
  <%= @search %>
</ul>

<% end %>

<p><%= link_to 'All Users',  users_path %></p>

@search пусто, когда я поднимаю его в консоли.Но, как вы можете видеть ниже, параметры успешно сохраняются в URL страницы индекса:

http://localhost:3000/searches?utf8=%E2%9C%93&username=stella&gender=Female

Вот видео , объясняющее, что именно я хочу сделать:

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 26 мая 2018

Хорошо, вы должны попытаться найти пользователей по параметрам поиска, например, если gender=Female возвращает всех пользователей, что Females, верно?Затем следуйте инструкциям.

В search_controller вы возвращаете всех пользователей на основе параметров

def index
    if params[:username] || params[:gender].present?
        @users = User.where('true').paginate(page: params[:page], per_page: 10)
        @users = @users.where(username: params[:username]) unless params[:username].blank?
        @users = @users.where(gender: params[:gender]) unless params[:gender].blank?
    else
        @users = User.all.paginate(page: params[:page], per_page: 10)
    end
end

, затем searches/index.html.erb, как это, так же, как ваш users

<ul class="users">
  <% @users.each do |user| %>
    <%= user.username %>
    ..........
  <% end %>
</ul>

Вышеуказанная часть была только для поиска User.Теперь, если вам нужно сохранить эти параметры поиска, используйте следующее:

Search.create(username: params[:username],gender: params[:gender])

. Эти параметры будут сохраняться при каждом поиске.Тогда действие index будет выглядеть так:

def index
    if params[:username] || params[:gender].present?
        @users = User.where('true').paginate(page: params[:page], per_page: 10)
        @users = @users.where(username: params[:username]) unless params[:username].blank?
        @users = @users.where(gender: params[:gender]) unless params[:gender].blank?

        Search.create(username: params[:username],gender: params[:gender])
    else
        @users = User.all.paginate(page: params[:page], per_page: 10)
    end
end

Надеюсь, это то, что вы хотите.

Обновление

Прежде всего, у вас естьпропустил что-то вроде того, что вы использовали

@search = User.where('true').paginate(page: params[:page], per_page: 10)
@search = User.where(username: params[:username]) unless params[:username].blank?
@search = User.where(gender: params[:gender]) unless params[:gender].blank?

в приведенном выше коде, это будет работать только для одной строки, не объединяющей три строки, потому что вы отделили модель User

вместо

@search = User.where('true').paginate(page: params[:page], per_page: 10)
@search = @search.where(username: params[:username]) unless params[:username].blank?
@search = @search.where(gender: params[:gender]) unless params[:gender].blank?

, который комбинируется, как при установке username, он будет работать, а при установке gender также будет работать, но ваш код всегда выполняет последнюю строку.

Новый запрос предназначен дляsearch (Вы можете использовать, если вам нужно)

@search = User.where(username: params[:username]).where(gender: params[:gender]).paginate(page: params[:page], per_page: 10)

Этот запрос эквивалентен

SELECT "users".* FROM "users" WHERE "users"."username" = 'xyz' AND "users"."gender" = 'xyz'"

, он выполнит условие, и как username и gender должны совпадать, иначеfalse

Точка 2 Пока вы используете оператор like и знак процента %male%, он будет искать любые значения, имеющие male в любой позиции, когда он находится в списке женский и вы мужской он будет соответствовать, потому что женский заботливыйth мужской , поэтому результаты поиска возвращают женский , пока вы ищете мужской , вам нужен точный поиск, как показано ниже.

Пожалуйста, сообщите, если вас неправильно понялиили я.

@search = User.where(username: params[:username]).where(gender: params[:gender]).paginate(page: params[:page], per_page: 10)
...