Ruby on rails 使用Rails进行高级搜索

Ruby on rails 使用Rails进行高级搜索,ruby-on-rails,ruby-on-rails-4,search,Ruby On Rails,Ruby On Rails 4,Search,我正在rails应用程序上创建一个高级搜索功能。我想添加一个功能,可以根据用户名和性别进行搜索和筛选。为此,我添加了一个名为搜索模型的新模型,该模型有两列:用户名和性别。我从中汲取了灵感,但对该功能进行了极大的定制,以满足我对该应用程序的需求。到目前为止,一切都顺利进行,我的意思是,作为页面管理员,我可以成功地在不同模型的两个索引之间导航:用户模型和搜索模型。唯一的问题是,我正在努力捕获我的参数(正在搜索的内容)并将其保存在控制器中,以便可以在搜索模型的索引中查看它。这是我的搜索模型索引代码:

我正在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 %>
这是我的搜索模型的索引:

<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>
以下是我想做的具体解释:


任何帮助都将不胜感激

好的,您必须尝试根据搜索参数搜索用户,比如如果
gender=Female
返回所有用户,即
Females
,对吗?然后按照说明去做

search\u 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
然后
搜索/index.html.erb
如下,与您的
用户一样

<ul class="users">
  <% @users.each do |user| %>
    <%= user.username %>
    ..........
  <% end %>
</ul>
它将在每次搜索时保存这些参数。然后索引操作将如下所示

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
时也会工作,但您的代码总是执行最后一行

新查询用于搜索(如果需要,可以使用)

此查询相当于

SELECT "users".* FROM "users" WHERE "users"."username" = 'xyz' AND "users"."gender" = 'xyz'"
它将生成条件,如
用户名
性别
必须匹配,否则为false

点2当您使用
like
运算符和
%male%
百分号时,它将搜索在任何位置具有
male
的任何值,在lis中,女性和男性将匹配,因为女性关心男性,这就是为什么搜索结果返回女性,而男性搜索时,您需要如下精确搜索

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

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

不清楚!你想要什么?用户搜索时是否保存搜索参数?嘿@fool dev谢谢你的帮助!我附上了一个视频,在那里我准确地解释了我想做什么。你好@fool dev!再次感谢你的帮助。我使用了你的一些解决方案,但做了一些修改,因为它没有完全起作用。现在我有另一个问题。我在这段视频中对此进行了解释:嘿@Alydabous,要想知道到底发生了什么有点困难,请参见答案中的更新部分。我看过视频,对
create
方法感到困惑。
@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'"
@search = User.where(username: params[:username]).where(gender: params[:gender]).paginate(page: params[:page], per_page: 10)