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