Forum: Rails-ES Conditions de un paginate en forma de cadena

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
B698654ff41a724e7a847e9e3a236908?d=identicon&s=25 Marcos Calleja (rantamplan)
on 2007-08-01 12:38
Hola!. Pues mi problema es el siguiente: uso el método paginate que
tiene un atributo llamado :conditions. Este atributo es de la forma:

['campo1 like ? and campo2 like ? and campo3 like
?',@campo1,@campo2,@campo3]

El problema es que para hacer viable la implementación (son muchos
campos con muchas posibilidades), había pensado en ir metiendolo todo en
una cadena mediante ifs. Pero después de haberlo hecho todo, no me he
percatado de que no podía ser tipo cadena. Así pues alguien sabe de
alguna función o algo que me permita transformar esa cadena en lo que me
pide el método paginate?

Un saludo y gracias de antemano.
E91518f050cb6081186ff461950099e0?d=identicon&s=25 Luis Villegas (vilec)
on 2007-08-01 12:54
(Received via mailing list)
Una cosa chapucera. Si miras lo que recibe el conditions, es un array
con
una cadena como primer valor ('campo1 like ? and campo2 like ? and
campo3
like ?') y los siguientes valores son variables.

Pues te creas un método que reciba el array que estás generando, el
nombre
del campo de la bbdd y el valor de la condición. A la posición [0] del
array
(la cadena )  le añades un and y le metes el nombre del campo  con un
like ?
y al array le añades el valor de la condición.


Te quedaría algo así:

  def format_condicion(array,parametro,campo)
    unless parametro.blank?
      if array[0]
        array[0]<< " AND "
      else
        array[0] = ""
      end
      array[0]<< "#{campo} like ? "
      array << parametro
    end
    array
  end

Y lo llamas así:

def tu_action
    condiciones = []
    format_condicion(condiciones,params[:campo1],"campo1")
    format_condicion(condiciones,params[:campo2],"campo2")
    format_condicion(condiciones,params[:campo3],"campo3")
    Modelo.find :all, :condtions => condiciones
end
1f2eadfb41362800ebc2cf211b91d0f7?d=identicon&s=25 javier ramirez (Guest)
on 2007-08-01 13:09
(Received via mailing list)
Hola,

> ['campo1 like ? and campo2 like ? and campo3 like
> ?',@campo1,@campo2,@campo3]
>
> percatado de que no podía ser tipo cadena. Así pues alguien sabe de
> alguna función o algo que me permita transformar esa cadena en lo que me
> pide el método paginate?
>
pues.. hay dos sintáxis de la claúsula conditions que vienen muy bien
para estos casos. Cuando tienes sólo un campo o dos como condition lo
del ? viene muy a mano, pero cuando tienes más campos es posible tirar
de otras soluciones.

puedes usar un conditions tal que
:conditions=>{:campo1=>variable_1, :campo2=>:variable2}

esto te hace una claúsula where con los campos y valores que le das
separados por AND

otro caso posible es
:conditions=>['campo1 > :campo1 OR campo2 >
:campo2',{:campo1=>valor1,:campo2=>valor2}]

eso te funciona como el ? pero vas con variables con nombre en lugar de
?

según cómo lo quieras organizar cualquiera de las dos te puede funcionar
bien, aunque en tu caso lo mismo es más fácil la primera. Es cuestión de
ir añadiendo dinámicamente a una estructura las variables que quieres
incluir en la where. De hecho, si estructuras tu form bien, puede ser
tan fácil como hacer

:conditions=>params[:mi_modelo]

si estás buscando directamente de un modelo que aparece en un form, con
eso te vale. Te haría un AND de todos los campos que le pases con esos
valores (eso sí, no te vale para LIKE, >, <, etc... para esos casos
tendrías que ir por la opción b)

saludos,

j
B698654ff41a724e7a847e9e3a236908?d=identicon&s=25 Marcos Calleja (rantamplan)
on 2007-08-01 13:29
Muy buenas opciones las que me habéis dado. La segunda creo que no voy a
poder implementarla porque hay algunos casos en los que tengo que hacer
SELECT en vez de poner simplemente el campo. Y además el like me
interesa porque algunos campos no son exactos, sino que acepto texto
antes y después.

Creo que me haré un método como dice Luis que me vaya añadiendo lo que
le pase. Bueno de hecho copiaré básicamente el que me has puesto porque
es perfecto =) muchas gracias a los dos!.

Un saludo
E91518f050cb6081186ff461950099e0?d=identicon&s=25 Luis Villegas (vilec)
on 2007-08-01 13:37
(Received via mailing list)
Ahora que me doy cuenta, según parece, quieres un filtro que busque con
comodines. Ponle en el método que te he pasado, lo siguiente:

array << '%'+parametro+'%'
B698654ff41a724e7a847e9e3a236908?d=identicon&s=25 Marcos Calleja (rantamplan)
on 2007-08-01 13:42
Si bueno como todos los campos no van ser así, simplemente cuando lo
necesite le añado eso al pasar el parámetro y listo... aunque ahora que
lo pienso se usa parámetro en el unless...

Bueno me hago 2 métodos, uno para los que no necesiten el filtro y otro
para los que sí. Gracias de new.
This topic is locked and can not be replied to.