Module: Forcast::Controller::Relacion
- Extended by:
- ActiveSupport::Concern
- Included in:
- Api::ActionLogsController, Api::ActionsController, Api::PollingsController, Api::RuleLogsController, Api::RulesController, Api::VARIABLEController, Api::WebhooksController
- Defined in:
- lib/forcast/controllers/controller/relacion.rb
Instance Method Summary collapse
- #c_to_m(str) ⇒ Object
- #comprobar_relacion(re, var) ⇒ Object
- #deep_deep_relation(init, comp, i, arr) ⇒ Object
-
#deep_relacion_directa_indirecta(rel) ⇒ Object
Comprueba que el recurso anidado corresponda al orden del request EX: localhost:4000/api/usuarios/20/recintos/2/ubicacions El metodo comprueba que la ubicacion pertenezca al recinto 2 asociado al usuario 20.
- #deep_relation ⇒ Object
- #fetch_from_relations_model(arr, rel) ⇒ Object
- #relacion_directa_indirecta ⇒ Object
- #relacion_padre ⇒ Object
- #relation ⇒ Object
Instance Method Details
#c_to_m(str) ⇒ Object
29 30 31 |
# File 'lib/forcast/controllers/controller/relacion.rb', line 29 def c_to_m(str) return str.classify.constantize end |
#comprobar_relacion(re, var) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/forcast/controllers/controller/relacion.rb', line 45 def (re,var) model.reflect_on_all_associations(re).each do |x| n = x.name.to_s if n == var return true break else next end end return false end |
#deep_deep_relation(init, comp, i, arr) ⇒ Object
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/forcast/controllers/controller/relacion.rb', line 116 def deep_deep_relation (init,comp,i,arr) #Encuentra la cadena de relaciones entre un modelo padre y otro hijo #EX: [usuario,recinto,ubicacion,camara,grabacions] #Toma usuario y grabacions y encuentra la cadena init.reflect_on_all_associations(:has_many).each do |x| x = x.name.to_s #p x #p i arr.push(x) if x == comp throw :exit else i = i + 1 deep_deep_relation(c_to_m(x),comp,i,arr) end i = i - 1 arr.delete(x) end end |
#deep_relacion_directa_indirecta(rel) ⇒ Object
Comprueba que el recurso anidado corresponda al orden del request EX: localhost:4000/api/usuarios/20/recintos/2/ubicacions El metodo comprueba que la ubicacion pertenezca al recinto 2 asociado al usuario 20
80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/forcast/controllers/controller/relacion.rb', line 80 def deep_relacion_directa_indirecta(rel) init = c_to_m(rel[0]).find(params[rel[0]+'_id']) rel.each_with_index do |ar,index| next if index + 1 == rel.length #Lanza un error si no encuentra el recurso en alguno de los padres begin init = init.send(rel[index+1]).find(params[rel[index+1]+'_id']) rescue => e raise Application::Error::General.new(t("error_deep_relation_doesnt_exist", param: e)) end end relation end |
#deep_relation ⇒ Object
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/forcast/controllers/controller/relacion.rb', line 94 def deep_relation return @model unless request.request_method_symbol == :get rel = [] params.keys.map { |val| rel.push(val.chomp('_id')) if val.include?('_id') && val != 'model_id' && val != 'modelo_id' && val != 'modelo'} rel = rel.last #Entender bien cuando se produce el Trigger, si la url es #/usuarios el last es action, si es /usuario/:id es id #ademas si /usuario limit=1 envio parametos el last key es igual a usuario #entonces compruebo el largo de los params return @model if rel == nil || rel == 'action' || rel == 'id' || params.keys.length > 7 return @model if (:belongs_to, rel) init = c_to_m(rel) i = 0 arr = [] arr.push(rel) comp = model.name.to_s.downcase! catch :exit do deep_deep_relation(init,comp,i,arr) end return fetch_from_relations_model(arr,rel) end |
#fetch_from_relations_model(arr, rel) ⇒ Object
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/forcast/controllers/controller/relacion.rb', line 135 def fetch_from_relations_model(arr,rel) #Recibe un array con las relaciones ordenadas de mayor a menos #[usuario,recinto,ubicacion,camara] #Recibe rel que es igual al primer valor del parametro mayor #params[:usuario_id] rel = params[rel+'_id'] init = c_to_m(arr[0]).find(rel) arr.each_with_index do |ar,index| next if index + 1 == arr.length init = c_to_m(arr[index+1]).send(:where, { ar + '_id' => init}) end @model = init # @model = Grabacion.where(camara_id: # Camara.where(hub_id: # Hub.where(recinto_id: # Recinto.where(usuario_id: # Usuario.find(rel))))) end |
#relacion_directa_indirecta ⇒ Object
67 68 69 70 71 72 73 74 75 76 |
# File 'lib/forcast/controllers/controller/relacion.rb', line 67 def relacion_directa_indirecta ##Fijarse en estos parametros ya que nos interesan solo los de la url original, quizas sea mejor parsear la url.split("/") return @model unless request.request_method_symbol == :get rel = [] params.keys.map { |val| rel.push(val.chomp('_id')) if val.include?('_id') && val != 'model_id' && val != 'modelo_id' && val != 'modelo'} if rel.length > 1 return deep_relacion_directa_indirecta(rel) end relation end |
#relacion_padre ⇒ Object
59 60 61 62 63 64 65 |
# File 'lib/forcast/controllers/controller/relacion.rb', line 59 def relacion_padre raise Application::Error::General.new(t("error_relation_param", param: params[:padre])) unless (:belongs_to, params[:padre]) params_permitidos_enviar = abstract_controller(params[:padre]).new.send (:params_permitidos_enviar) @response = c_to_m(params[:padre]).find(@model_id.send(params[:padre]+'_id')) @response = @response.attributes.slice(*params_permitidos_enviar) end |
#relation ⇒ Object
33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/forcast/controllers/controller/relacion.rb', line 33 def relation controller = controller_name.chomp('s') model.reflect_on_all_associations(:belongs_to).each do |x| n = x.name.to_s nid = n +"_id" if params.include?(nid) return c_to_m(n).find(params[nid]).send(controller) break end end end |