Eso puede andar, Emilio.
Yo había pensado meterme en AR justo cuando enumera las columnas de la tabla
para ahí mismo omitirle las que no correspondían y así evitar toda la
automagia de ActiveRecord. Tanta magia a veces molesta. Con 'magia' me
refiero a todo lo que hace por detrás sin que haya que declarar nada. Quería
evitar que inclusive me mostrara todos los campos incorrectos al hacerle un
inspect al objeto.

Con otros ORMs (no tan mágicos) hay que ser más específico, lo cual en
algunos casos me resulta mejor. De cualquier manera lo resolví mejor con
DataMapper, que funciona realmente bien.

Gracias por responder, obviamente. Siempre es bueno escuchar otras
campanas...

Lucas Florio
Developer
----
Personal: http://www.lucasefe.com.ar/


2009/7/16 Emilio Tagua <[email protected]>

> 2009/7/14 Lucas Florio <[email protected]>:
> > Buenas, Rubias
> >
> > Estoy teniendo el siguiente tema. Quiero implementar STI pero quiero
> evitar
> > que se muestren los campos/atributos que no corresponden a una clase
> > específica. El ejemplo sería este:
> >
> > class Componente < AR::Base
> >   # nombre: string
> > end
> >
> > class ComponenteUno < Componente
> >     # campo1
> > end
> >
> > class ComponenteDos < Componente
> >    # campo2
> >    # campo3
> > end
> >
> > La Tabla componentes contiene a todos los campos (nombre, campo(1..3)).
> > La idea es que ComponenteDos.new no responda a campo1.
> > Y que ComponenteUno no responda a campo2 ni a campo3.
> > Yo me había imagino un mixin de esta forma, pero no se si existe algo así
> > ya:
> >
> > class ComponenteDos < Componente
> >    properties :campo2, :campo3 # y que te oculte lo demás
> >    # Sé que con DataMapper seguramente lo pueda hacer, pero quería
> > intentarlo con AR antes.
> > end
> >
> > Alguna idea? Saben de algo así?
>
> Y que tal un poco de metaprogramación...
>
> class Componente
>  attr_accessor :campo1, :campo2, :campo3, :campo4
> end
>
> class ComponenteDos < Componente
>  DENIED_PROPERTIES = ["campo3", "campo4"].freeze
>
>  for property in DENIED_PROPERTIES
>    class_eval %{
>      undef_method "#{property}"
>      undef_method "#{property}="
>     }
>  end
> end
>
> class ComponenteTres < Componente
> end
>
> c = ComponenteDos.new
> c.campo1 # => nil
> c.campo2 # => nil
> c.campo3 # => NoMethodError: undefined method `campo3' for
> #<ComponenteDos:0x1b3b608>
> c.campo4 # => NoMethodError: undefined method `campo3' for
> #<ComponenteDos:0x1b3b608>
>
> c = ComponenteTres.new
> c.campo4 # => nil
>
> No se que te parezca pero podría ser algo asi...
>
> Saludos!
> _______________________________________________
> Ruby mailing list
> [email protected]
> http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
>
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a