Ruby on Rails的:搜索表单 - 多个搜索字段(Ruby on Rails: Search

2019-06-26 10:23发布

我想创建一个应用程序,允许用户搜索数据库。 搜索页面布局会表现得与一些下拉菜单,将已经显示数据库中的数据,以缩小搜索范围,并文本框允许用户投入的关键词,如“项目名称”。 我有越来越轨道采取已在搜索表单中输入的所有信息的问题,并进行一个大的搜索。

这里是我的搜索布局的一部分:

<%= form_tag search_path, :method => 'get' do %>

<%= hidden_field_tag :direction, params[:direction] %>
 <%= hidden_field_tag :sort, params[:sort] %>
<p>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search Project Name", :project_name => nil %>
</p>
<p>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search Client", :client => nil %>
</p>
<% end %> 

这里是我的索引,并在项目负责人的搜索行为:

def index
@projects = Project.all

respond_to do |format|
  format.html # index.html.erb
  format.json { render :json => @projects }
 end
end

def search

@project_search = Project.search(params[:search]).order(sort_column + ' ' + sort_direction).paginate(:per_page => 5, :page => params[:page])


end

这里是我的模型/ project.rb文件的一部分

def self.search(search)
if search
  where('project_name LIKE ?', "%#{search}%") || where('client LIKE ?', "%#{search}%")
else
  scoped
end
end

正如你所看到的,我只是想在任一PROJECT_NAME或客户端进行搜索。 如果我能得到这个工作,我将其扩展到其他领域。

在目前的功能是,当我试图寻找这两个框,它会覆盖一个,并且只做领域的搜索之一。

我是全新的,以回报率,所以希望有人可以提供帮助。 任何建议将不胜感激。

提前致谢!

Answer 1:

这个问题已经解决了另一个问题: Ruby on Rails的:高级搜索

根据您的问题,@克里斯明智,那就是假设你在你的两列projects表: project_nameclient

我可能是错的,但我想你实际上有两种型号ClientProject ,其中客户端有很多项目。 如果是这样,你需要定义每个模型的搜索:

客户端模式:

def self.search search_term
  return scoped unless search_term.present? 
  where(['client_name LIKE ?', "%#{search_term}%"]) #client_name means the column name, change it to the correct name.
end

项目模型:

def self.search search_term
  return scoped unless search_term.present? 
  where(['project_name LIKE ?', "%#{search_term}%"]) #project_name means the column name, change it to the correct name.
end

您的形式:

<%= form_tag projects_path, method: :get do %>
  <%= text_field_tag :project_name, params[:project_name] %>
  <%= text_field_tag :client, params[:client] %>
  <%= submit_tag "Search", name: nil %>
<% end %>

然后你的控制器:

#return all projects that match the search criteria
@project_search = Project.search(params[:project_name]).all
#return all clients that match the search criteria
@clients_search = Client.search(params[:client]).all

我希望它可以帮助...



Answer 2:

我想建议你可能想要做一些事情。 首先,除了在你的控制器索引方法具有搜索方法是不必要的,因为它们都呈现项目的集合。

所以第一关,我会改变:

<%= form_tag search_path, :method => 'get' do %>

<%= form_tag projects_path, :method => 'get' do %>

这将调用索引方法来代替。

我接下来建议把搜索逻辑本身到模型中。

在你的项目类中,添加下面的方法:

def self.search search_term
  return scoped unless search_term.present?
  where(['project_name LIKE ? OR client LIKE ?', "%#{search_term}%", "%#{search_term}%"])
end

最后,修改索引你的控制器动作如下:

@projects = Project.search(params[:search]).all

有效地你在做什么是搜索只如果长期存在,并且以其他方式链接的范围。



文章来源: Ruby on Rails: Search Form - multiple search fields