how - Ruby on Rails: búsqueda avanzada
render html in rails api (2)
He estado usando MetaSearch en mi aplicación y me pareció muy conveniente. Si ya lo has considerado, ¿qué problemas tienes?
También hay un Ransack del mismo autor, es un sucesor de MetaSearch.
Tengo problemas para entender la mejor forma de crear un formulario de búsqueda avanzada. He tenido una buena búsqueda en internet, buscando algunas formas, pero no puedo hacer que funcionen, ya que la mayoría de las sugerencias están desactualizadas. Ya hice una pregunta, pero creo que era demasiado específica y no pude solucionar mi problema. Quiero buscar en diferentes cuadros de texto y cuadros desplegables con un botón de búsqueda.
EDIT2:
project_controller:
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 => 2, :page => params[:page])
end
# GET /projects/1
# GET /projects/1.json
def show
@project = Project.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @project }
end
end
# GET /projects/new
# GET /projects/new.json
def new
@project = Project.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @project }
end
end
# GET /projects/1/edit
def edit
@project = Project.find(params[:id])
end
# POST /projects
# POST /projects.json
def create
@project = Project.new(params[:project])
@project.client = params[:new_client] unless params[:new_client].blank?
@project.exception_pm = params[:new_exception_pm] unless params[:new_exception_pm].blank?
@project.project_owner = params[:new_project_owner] unless params[:new_project_owner].blank?
@project.role = params[:new_role] unless params[:new_role].blank?
@project.industry = params[:new_industry] unless params[:new_industry].blank?
@project.business_div = params[:new_business_div] unless params[:new_business_div].blank?
respond_to do |format|
if @project.save
format.html { redirect_to @project, notice: ''Project was successfully created.'' }
format.json { render json: @project, status: :created, location: @project }
else
format.html { render action: "new" }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
# PUT /projects/1
# PUT /projects/1.json
def update
@project = Project.find(params[:id])
respond_to do |format|
if @project.update_attributes(params[:project])
format.html { redirect_to @project, notice: ''Project was successfully updated.'' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
# DELETE /projects/1
# DELETE /projects/1.json
def destroy
@project = Project.find(params[:id])
@project.destroy
respond_to do |format|
format.html { redirect_to projects_url }
format.json { head :no_content }
end
end
private
helper_method :sort_column, :sort_direction
def sort_column
Project.column_names.include?(params[:sort]) ? params[:sort] : "project_name"
end
def sort_direction
%w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
end
end
Vista de búsqueda:
<h1>Search</h1>
<%= form_tag search_path, method: :get do %>
<%= hidden_field_tag :direction, params[:direction] %>
<%= hidden_field_tag :sort, params[:sort] %>
<%= text_field_tag :project_name, params[:project_name] %>
<%= text_field_tag :client, params[:client] %>
<%= submit_tag "Search", name: nil %>
<% end %>
<table class = "pretty">
<table border="1">
<tr>
<th><%= sortable "project_name", "Project name" %> </th>
<th><%= sortable "client", "Client" %></th>
<th>Exception pm</th>
<th>Project owner</th>
<th>Tech</th>
<th>Role</th>
<th>Industry</th>
<th>Financials</th>
<th>Business div</th>
<th>Status</th>
<th>Start date</th>
<th>End date</th>
<% if false %>
<th>Entry date</th>
<th>Edited date</th>
<th>Summary</th>
<th>Lessons learned</tStackh>
<th>Customer benifits</th>
<th>Keywords</th>
<!th></th>
<!th></th>
<!th></th>
<% end %>
</tr>
<% @project_search.each do |t| %>
<tr>
<td><%= t.project_name %></td>
<td><%= t.client %></td>
<td><%= t.exception_pm %></td>
<td><%= t.project_owner %></td>
<td><%= t.tech %></td>
<td><%= t.role %></td>
<td><%= t.industry %></td>
<td><%= t.financials %></td>
<td><%= t.business_div %></td>
<td><%= t.status %></td>
<td><%= t.start_date %></td>
<td><%= t.end_date %></td>
<% if false %>
<td><%= t.entry_date %></td>
<td><%= t.edited_date %></td>
<td><%= t.summary %></td>
<td><%= t.lessons_learned %></td>
<td><%= t.customer_benifits %></td>
<td><%= t.keywords %></td>
<% end %>
<!td><%#= link_to ''Show'', project %></td>
<!td><%#= link_to ''Edit'', edit_project_path(project) %></td>
<!td><%#= link_to ''Destroy'', project, method: :delete, data: { confirm: ''Are you sure?'' } %></td>
</tr>
<% end %>
</table>
<br />
<%= will_paginate (@project_search) %>
<%= button_to "Search Again?", search_path, :method => "get" %>
<%# end %>
<%= button_to "Home", projects_path, :method => "get" %>
Project.rb
class Project < ActiveRecord::Base
attr_accessible :business_div, :client, :customer_benifits, :edited_date, :end_date, :entry_date, :exception_pm, :financials, :industry, :keywords, :lessons_learned, :project_name, :project_owner, :role, :start_date, :status, :summary, :tech
validates_presence_of :business_div, :client, :customer_benifits, :end_date, :exception_pm, :financials, :industry, :keywords, :lessons_learned, :project_name, :project_owner, :role, :start_date, :status, :summary, :tech
def self.search search_term
return scoped unless search_term.present?
where find(:all, :conditions => [''project_name OR client LIKE ?'', "%#{search_term}%"])
end
end
Rutas:
FinalApp::Application.routes.draw do
resources :projects
match "search" => "projects#search", :as => :search
root :to => ''projects#index''
end
Como puede ver, todavía estoy un poco lejos de tener una aplicación terminada. Estoy intentando crear un formulario de búsqueda que pueda buscar en los siguientes campos: Nombre del proyecto, Cliente, ID, Industria, Rol, Tecnología, Propietario del proyecto, Estado, Fecha de inicio, Fecha de finalización y Palabras clave. El formulario de búsqueda tendría cuadros de texto o menús desplegables según el campo que el usuario estaba buscando. Quiero encadenar cada campo y buscar en todos ellos de una vez. Antes, solo usaba project_name y el cliente como ejemplos para facilitar la comprensión de mi código. Espero que puedas ver ahora lo que estoy tratando de hacer.
Puede crear un nuevo controlador llamado search
.
Su formulario de búsqueda:
<%= form_tag search_index_path, method: :get do %>
<%= text_field_tag :project, params[:project] %>
<%= text_field_tag :client, params[:client] %>
<%= submit_tag "Search", name: nil %>
<% end %>
incude en sus rutas.rb:
get "search/index"
su controlador de búsqueda:
def index
#store all the projects that match the name searched
@projects = Project.where("name LIKE ? ", "%#{params[:project]}%")
#store all the clients that match the name searched
@clients = Client.where("name LIKE ? ", "%#{params[:client]}%")
end
Ahora puedes jugar con @projects
y @clients
en la vista de índice.
Solo tenga cuidado, porque estas variables podrían ser nulas si no hay coincidencia para la búsqueda.
EDITAR - Supongo que tiene dos modelos Project
y Client
: si no puede crear un nuevo controlador, puede crear la acción de búsqueda en su controlador actual.
def search
#store all the projects that match the name searched
@projects = Project.where("name LIKE ? ", "%#{params[:project]}%")
#store all the clients that match the name searched
@clients = Client.where("name LIKE ? ", "%#{params[:client]}%")
end
Y que puede usar @projects
y @clients
en la vista de búsqueda.
Si intenta mostrar los resultados en otro lugar (por ejemplo, vista de index
), puede mover lo anterior a la acción correcta.
def index
....
#store all the projects that match the name searched
@projects = Project.where("name LIKE ? ", "%#{params[:project]}%")
#store all the clients that match the name searched
@clients = Client.where("name LIKE ? ", "%#{params[:client]}%")
end
EDIT 2 - Está bien, está intentando buscar por una combinación de campos en el mismo modelo:
Usted y cambie su método de búsqueda para agregar estos dos campos:
def self.search(search_project, search_client)
return scoped unless search_project.present? || search_client.present?
where([''project_name LIKE ? AND client LIKE ?'', "%#{search_project}%", "%#{search_client}%"])
end
Pero ten en cuenta que ||
devolverá el alcance si su search_project O search_client no están presentes, puede cambiar para AND (&&) si lo prefiere.
Además, el AND
regresará solo si ambos coinciden, me refiero a la combinación de búsqueda ... También puede cambiarlo a OR
si lo desea.
Tener el formulario de búsqueda:
Su formulario de búsqueda:
<%= form_tag search_index_path, method: :get do %>
<%= text_field_tag :project, params[:project] %>
<%= text_field_tag :client, params[:client] %>
<%= submit_tag "Search", name: nil %>
<% end %>
Entonces su controlador debe enviar la combinación al modelo:
@project_search = Project.search(params[:project], params[:client]).all
Creo que resolverá el problema ...