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

Responder a