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

Posted

技术标签:

【中文标题】Ruby on Rails:搜索表单 - 多个搜索字段【英文标题】:Ruby on Rails: Search Form - multiple search fields 【发布时间】:2012-07-19 15:31:27 【问题描述】:

我正在尝试创建一个允许用户搜索数据库的应用程序。搜索页面布局将与一些下拉菜单一起运行,这些下拉菜单将显示数据库中已有的数据以缩小搜索范围,以及允许用户输入“项目名称”等关键词的文本框。我无法让 rails 获取已在搜索表单中输入的所有信息并执行一次大搜索。

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

<%= 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 或客户端。如果我能做到这一点,我会将它扩展到其他领域。

目前的功能是,当我尝试在两个框中搜索它时,它会覆盖一个,并且只进行其中一个字段搜索。

我是 ROR 的新手,希望有人能提供帮助。任何建议将不胜感激。

提前致谢!

【问题讨论】:

【参考方案1】:

这个问题已经在另一个问题中解决了:Ruby on Rails: Advanced search

根据您的问题,@Chris Wise 假设您的 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

希望对你有帮助……

【讨论】:

【参考方案2】:

我想建议您可能想做的一些事情。首先,在控制器中除了 index 方法之外还有一个 search 方法是不必要的,因为它们都在渲染项目集合。

所以首先,我会改变:

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

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

这将调用 index 方法。

接下来我建议将搜索逻辑本身放入模型中。

在您的 Project 类中,添加以下方法:

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

最后,修改 index 的控制器操作如下:

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

实际上,您所做的是仅在存在术语时才进行搜索,否则会链接范围。

【讨论】:

感谢您回复我。它仍然不能解决我想要 2 个文本框的问题。因此,如果他们将项目名称放在一个框中,将客户名称放在另一个框中,它应该将它们链接起来并在两个字段上进行搜索,但在搜索时,只有客户端框有效。

以上是关于Ruby on Rails:搜索表单 - 多个搜索字段的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails:高级搜索,nil:Nilclass 的未定义方法 []

Ruby on Rails:高级搜索

如何在 ruby​​ on rails 4 中创建高级搜索

在 Ruby on Rails 3 应用程序中实现搜索?

在 Ruby on Rails 中搜索的最佳选择是啥? [关闭]

在 Ruby on Rails 中使用 WHERE 搜索功能时出错