Ruby on Rails:搜索表单 – 多个搜索字段
我正在尝试创建一个允许用户搜索数据库的应用程序。 搜索页面布局会显示一些下拉菜单,这些菜单会显示数据库中已有的数据以缩小搜索范围,还会显示文本框以允许用户输入关键字,如“项目名称”。 我在使用rails获取搜索表单中输入的所有信息并执行一次大搜索时遇到问题。
这是我的搜索布局的一部分:
'get' do %> nil %>
nil %>
这是我在项目控制器中的索引和搜索操作:
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或客户端。 如果我可以将其工作,我将把它扩展到其他领域。
目前的function是,当我尝试搜索两个框时,它会覆盖一个,并且只进行一次字段搜索。
我是ROR的新手,所以希望有人可以提供帮助。 任何建议将不胜感激。
提前致谢!
此问题已在另一个问题中得到解决: Ruby on Rails:高级搜索
根据您的问题,@ Chris Wise假设您的projects
表中有两列: project_name
和client
。
我可能错了,但我认为你实际上有两个模型Client
和Project
,其中一个客户有很多项目。 如果是这样,您需要在每个模型中定义搜索:
客户端型号:
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
我希望它有帮助……
我想建议一些你可能想做的事情。 首先,除了控制器中的索引方法之外,还需要一个搜索方法,因为它们都是渲染项目的集合。
首先,我会改变:
<%= 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
实际上,您所做的只是搜索一个术语是否存在以及链接范围。