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

Responder a