使用Rails进行高级搜索

时间:2018-05-26 14:31:32

标签: ruby-on-rails ruby-on-rails-4 search

我正在我的rails应用程序上创建高级搜索功能。我想添加一个功能,我可以根据用户的姓名和性别进行搜索和过滤。我这样做是通过添加一个名为搜索模型的新模型,其中包含两列:username&性别。我从这个video和这个link中获取灵感,但是大大地定制了该功能以满足我对应用程序的需求。到目前为止,一切都流动成功,我的意思是作为页面的管理员,我可以在不同模型的两个索引之间成功导航:用户模型和搜索模型。唯一的问题是我正在努力捕获我的参数(被搜索的内容)并将其保存在控制器中,以便可以在搜索模型的索引中查看。这是我搜索模型索引的代码:

<% 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为空。但正如您在下面看到的那样,params成功保存在索引页面的URL中:

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

这是video解释我想要做的事情:

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

好的,您必须尝试根据搜索参数搜索用户,例如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])

它将在每次搜索时保存这些参数。然后索引操作将如下所示

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 = 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'"

它会使条件与usernamegender一样必须匹配,否则为假

第2点当您使用like运算符和%male%百分号时,它将搜索任何位置male的任何值, lis 女性男性它会匹配,因为女性关心男性这就是为什么搜索结果返回女性,当您搜索男性时,您需要完全搜索,如下所示。

如果误解你或我,请告知。

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