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