【问题标题】:Advanced Search with RailsRails 高级搜索
【发布时间】:2018-11-05 17:09:07
【问题描述】:

我正在我的 rails 应用程序上创建高级搜索功能。我想添加一个功能,可以根据用户的姓名和性别进行搜索和过滤。为此,我添加了一个名为搜索模型的新模型,其中包含两列:用户名和性别。我从这个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 在控制台中提升时为空。但正如您在下面看到的,参数已成功保存在索引页面的 URL 中:

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

这是video 解释我想要做什么:

任何帮助将不胜感激。

【问题讨论】:

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


【解决方案1】:

好的,您必须尝试根据搜索参数搜索用户,例如如果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 = 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 Female 而你 ma​​le 它会匹配,因为 Female 关心 ma​​le 这就是为什么搜索结果返回 Female 而你搜索男性,你需要像下面这样的精确搜索。

如果对你或我有误解,请指教。

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

【讨论】:

  • 你好@fool-dev!再次感谢您的帮助。我使用了你的一些解决方案,但做了一些改动,因为它没有完全工作。现在我有另一个问题。我在这个视频中解释它:drive.google.com/file/d/1_Y6nDDIxzUfDU1yChL0jys1gxsbE35aH/…
  • 嘿@AlyDabbous,找出实际情况有点困难,请参阅答案中的更新部分。我看过视频,我对create 方法感到困惑。
猜你喜欢
  • 2012-07-21
  • 1970-01-01
  • 2014-06-08
  • 2012-02-08
  • 2022-12-09
  • 1970-01-01
  • 2015-03-02
  • 2019-09-09
  • 2023-03-10
相关资源
最近更新 更多