module Forcast module Controller module Busqueda def index params[:dato] = true if params[:dato] == 'true' params[:dato] = false if params[:dato] == 'false' params[:contiene] = true if params[:dato] == 'true' params[:contiene] = false if params[:dato] == 'false' buscar_relaciones if params_present?('relacion') && !params_present?('buscar_por') && !params_present?('dato') es_array_buscar_por_parametro_exacto if params_present?('buscar_por') && params_present?('dato') es_array_buscar_por_parametro_contiene if params_present?('buscar_por') && params_present?('contiene') super() end def show buscar_relaciones if params_present?('relacion') && !params_present?('buscar_por') && !params_present?('dato') super() end private def es_array_buscar_por_parametro_exacto buscar_por = params[:buscar_por] dato = params[:dato] buscar_por.is_a?(Array) ? array_buscar_por_parametro_exacto(buscar_por,dato) : buscar_por_parametro_exacto(buscar_por,dato) end def es_array_buscar_por_parametro_contiene buscar_por = params[:buscar_por] contiene = params[:contiene] buscar_por.is_a?(Array) ? array_buscar_por_parametro_contiene(buscar_por,contiene) : buscar_por_parametro_contiene(buscar_por,contiene) end def array_buscar_por_parametro_exacto (buscar_por, dato) raise Application::Error::General.new(t("error_same_length_array")) unless buscar_por.length == dato.length response = [] buscar_por.each_with_index do |b,index| response[index] = buscar_por_parametro_exacto(b,dato[index]) end paso = [] response = response.inject(:&) if params[:join].to_s == 'false' response = [response] unless response.is_a?(Array) response.each_with_index do |rr,index| rr = [rr] unless rr.is_a?(Array) rr.each do |r| paso.push(r) end end @response = paso.uniq end def array_buscar_por_parametro_contiene (buscar_por, contiene) raise Application::Error::General.new(t("error_same_length_array")) unless buscar_por.length == contiene.length response = [] buscar_por.each_with_index do |b,index| response[index] = buscar_por_parametro_contiene(b,contiene[index]) end paso = [] response = response.inject(:&) if params[:join].to_s == 'false' response = [response] unless response.is_a?(Array) response.each do |rr| rr = [rr] unless rr.is_a?(Array) rr.each do |r| paso.push(r) end end @response = paso.uniq end def buscar_por_parametro_exacto (buscar_por, dato) raise Application::Error::General.new(t("error_search_param", param: buscar_por)) unless params_permitidos_buscar.include?(buscar_por) raise Application::Error::General.new(t("error_find_param", param: buscar_por)) unless @model.parametro_existe?(buscar_por,dato) resp = @model.buscar_parametro_exacto_scope(buscar_por,dato).limit(@limit).order('id desc').select(*params_permitidos_enviar) params_present?('relacion') ? @response = buscar_relacion(resp,params[:relacion]) : @response = resp end def buscar_por_parametro_contiene (buscar_por, contiene) raise Application::Error::General.new(t("error_search_param", param: buscar_por)) unless params_permitidos_buscar.include?(buscar_por) resp = @model.buscar_parametro_contiene_scope(buscar_por,contiene).limit(@limit).order('id desc').select(*params_permitidos_enviar) params_present?('relacion') ? @response = buscar_relacion(resp,params[:relacion]) : @response = resp end def buscar_relaciones resp = @model.all if @model resp = [@model_id] if @model_id @response = buscar_relacion(resp,params[:relacion]) end #Ver si es posible mejorar este metodo, se podria realizar una unica consulta #a la DB para tener todos los registro de toda la tabla def buscar_relacion(resp,rel) return buscar_relacion_array(resp,rel) if rel.is_a?(Array) #p Api::CamarasController.name.tableize.gsub!('camaras', 'hubs').classify comprobar_relacion_buscar(rel) array = [] resp.each do |x| array.push( { controller_name.classify => [x.attributes.slice(*params_permitidos_enviar)], rel.classify => x.send(rel).limit(@limit_nested).select(*@params_permitidos_enviar) } ) end return array end def buscar_relacion_array(resp,rels) array = [Hash.new] rels.each do |rel| i = 0 comprobar_relacion_buscar(rel) resp.each_with_index do |x,index| array[index] = {} if array[index].nil? array[index].merge!({controller_name.classify => [x.attributes.slice(*params_permitidos_enviar)]}) if i == 0 array[index].merge!({ rel.classify => x.send(rel) .limit(@limit_nested) .select(*@params_permitidos_enviar) }) end i += 1 end return array end def comprobar_relacion_buscar (rel) begin @params_permitidos_enviar = abstract_controller(rel).new.send (:params_permitidos_enviar) rescue NameError => e raise Application::Error::General.new(t("error_relation_param", param: rel)) end raise Application::Error::General.new(t("error_relation_param", param: rel)) unless comprobar_relacion(:has_many, rel) end end end end