我想创建一个应用程序,允许用户搜索数据库。 搜索页面布局会表现得与一些下拉菜单,将已经显示数据库中的数据,以缩小搜索范围,并文本框允许用户投入的关键词,如“项目名称”。 我有越来越轨道采取已在搜索表单中输入的所有信息的问题,并进行一个大的搜索。
这里是我的搜索布局的一部分:
<%= 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或客户端进行搜索。 如果我能得到这个工作,我将其扩展到其他领域。
在目前的功能是,当我试图寻找这两个框,它会覆盖一个,并且只做领域的搜索之一。
我是全新的,以回报率,所以希望有人可以提供帮助。 任何建议将不胜感激。
提前致谢!
这个问题已经解决了另一个问题: Ruby on Rails的:高级搜索
根据您的问题,@克里斯明智,那就是假设你在你的两列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 %>
这将调用索引方法来代替。
我接下来建议把搜索逻辑本身到模型中。
在你的项目类中,添加下面的方法:
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
有效地你在做什么是搜索只如果长期存在,并且以其他方式链接的范围。