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

时间:2012-07-20 10:57:39

标签: ruby-on-rails ruby forms search textbox

我正在尝试创建一个允许用户搜索数据库的应用程序。搜索页面布局将使用一些下拉菜单来显示数据库中已有的数据以缩小搜索范围,还有文本框以允许用户输入关键词,如项目名称"。我在使用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

这是我的models / project.rb文件的一部分

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

如您所见,我只是尝试搜索project_name或客户端。如果我可以将其工作,我将把它扩展到其他领域。

目前的功能是,当我尝试搜索两个方框时,它会覆盖一个,只进行一次现场搜索。

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

提前致谢!

2 个答案:

答案 0 :(得分:4)

我想建议一些你可能想做的事情。首先,除了控制器中的索引方法之外,还需要一个搜索方法,因为它们都是渲染项目的集合。

首先,我会改变:

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

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

这将调用索引方法。

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

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

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

有效的是,您所做的只是搜索某个术语并以其他方式链接范围。

答案 1 :(得分:4)

  

此问题已在另一个问题中解决: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

我希望它有所帮助...

相关问题