Si tenes que evaluar código porque no queda otra, y a su vez esas reglas son dictadas por un usuario (un admin por ejemplo), lo más sencillo creo que pasaría por un metalenguaje, hay un patrón sobre ese tema.
Por otro lado, si el código lo vas a escribir vos, si, podes guardar el codigo y evaluarlo con un eval, o incluso incursionar en la metaprogramación y ver si sacas algo limpio por ahí. Ahora, si lo que tenes que hacer para decidir si mandas o no una nota pueden ser condiciones simples sobre los distintos atributos, hay una solución muy buena que consiste en lo siguiente (y creo que es limpia), ya fuese utilizando los anonymous scopes, o simplemente los conditions de un find, poder crear un admin sencillo donde el usuario dinamicamente pueda agregar o quitar los atributos (campos) del modelo de dato, la condicion sencilla (mayor, menor, igual, like, etc.) y el valor de esa condición. Despues cuando vas a ver a quien le tenes que mandar la Nota, simplemente vas ejecutando las condiciones que tenes en la DB que son administradas por el admin. De hecho incluso para evitar tener que crear bochas de condiciones por clientes, podes agrupar esas condiciones bajo otro modelo de datos, darles un nombre a un grupo de condiciones para poder ser reutilizadas bajo distintos clientes, y simplemente hacer las reglas polimorficas de tal manera que puedan ser asociadas al cliente directamente. No se si se entendio, pero es una idea Rodrigo Dominguez [email protected] On Wed, 7 Apr 2010 22:35:52 -0300, Porta ☢ <[email protected]> wrote: > 2010/4/7 NachoKB <[email protected]> > >> 2010/4/7 Porta <[email protected]> >> >> Gente. >>> Aca les vengo con una cuestion que no logro resolver, a ver que se les >>> ocurre. >>> Tengo un modelo (Nota) que tiene atributos titulo y cuerpo >>> Esos articulos se envian a distintos Proveedores (otro modelo). >>> >> >> entre Nota y Proveedor, ¿no tenés otra entidad? (un join model, sino >> tenés >> un has_and_belongs_to_many) >> > > Si, tengo otra entidad, nomas me parecio que no era relevante para la > descripcion del problema. > > >> >> >>> Cada Proveedor tiene distintos requerimientos en cuanto al contenido de >>> las Notas. >>> Cada uno de esos Requerimientos se puede expresar con pequenios >>> fragmentos >>> de codigo (en general tienen que ver con buscar ciertas palabras en el >>> cuerpo de la Nota, la longitud del titulo y cosas por el estilo) >>> Como los requerimientos son atomicos y van cambiando entre Proveedores, >>> pense en armar un modelo Requerimiento, y mandarlos a la base. >>> >>> Entonces, cuando proceso una Nota para enviar a un Proveedor, necesito >>> levantar la lista de Requerimientos que debo aplicar sobre la Nota, para >>> saber si se puede enviar o no. >>> Dicho en simple, como hago para guardar el codigo de cada Requerimiento >>> en >>> el modelo y "aplicarlo" a una Nota para saber cumple o no los >>> Requerimientos? >>> >> >> ¿necesitás tal flexibilidad realmente? Si sólo tenés un conjunto acotado >> de >> "tipos" de Requerimiento lo podés hacer con STI (Single Table >> Inheritance) >> >> class TienePalabras < Requerimiento; end >> >> si esta forma no te sirve, siempre podés tener una columna TEXT que >> contenga código Ruby y lo evalúes (pasandole la instancia de nota y >> proveedor se me ocurre)... >> >> > Esto es lo que estaba pensando, pero no tengo en claro como implementarlo. > Vengo de perl y en ese caso hubiera tirado un eval a lo macho sin pensarlo > siquiera. Pero (imagino que, es una idea mia sin fundamento) en ruby podria > haber alguna herramienta mas para hacerlo un poco mas prolijo. > > >> pero me da la impresión de que es más engorroso para el usuario >> (¡necesita >> saber Ruby!) y potencialmente peligroso; además si en realidad existen >> dos >> "tipos" de requerimientos pobre usuario le hacés retipear el mismo >> código >> una y otra vez... >> >> > En este caso, el usuario soy yo. Lo que quiero evitar es que cada > requerimiento nuevo que aparece, tener que tocar codigo en la aplicacion. > Ademas, hay un segundo nivel de usuario que va a tildar checkboxes para > determinar que requerimientos tiene una Nota determinada para mandar a un > Proveedor X. Es por eso que pense en tirar los Requerimientos en una tabla. > De modo que cuando el usuario manda a procesar una Nota, se agarran todos > los Requerimientos tildados, y se corre el codigo de cada requerimiento > sobre la Nota elegida. > > Si esto se hace con un eval, entonces lo saco con fritas. Se que en ruby > hay > Procs, lambdas y otras yerbas. Sospecho que se pueden usar para resolver el > tema que tengo, pero honestamente no tengo en claro ni que son, ni como se > usan ni si me sirven para este caso en particular. > > > >> nachokb >> >> _______________________________________________ >> Ruby mailing list >> [email protected] >> http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar >> >> -- Rodrigo Dominguez www.rorra.com.ar _______________________________________________ Ruby mailing list [email protected] http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
