2011-11-08 2 views
1

Si je devais extraire un champ d'une base de données dotée d'un wrapper intégré, je recevrais les données sous la forme d'un tableau d'objets, chaque objet ayant une série d'instances pouvant être appelées. Ainsi, par exemple:Quelle est la meilleure façon de contourner les méthodes dans une instance?

class DataWrapper 
    attr_reader :foo, :bar 
end 

Et les données sont renvoyées comme [@ data1, @ données2, @ data3, etc.] où @data [1-3] sont toutes les instances de DataWrapper.

Alors, que se passe-t-il si je reçois ces données avant de savoir dans quel contexte il va être utilisé, et comment je veux le formater. Quelle est la meilleure (non-Rails) façon de formater les données données des contextes spécifiques, tels que

case :xml 
    @data1.to_xml.foo #foo = 4 
case :web_table 
    @data1.to_web_table.foo #foo = "four" 

Répondre

1

Il semble que vous avez un tableau d'objets de BaseClass, et que vous voulez muter plus tard, les instances à certains sous-classe de BaseClass. Tu ne peux pas faire ça. Au lieu de cela, vous pouvez créer des modules pour chaque représentation de "sous-classe" et les mélanger dans les instances à la demande.

Si vous avez un tableau d'objets et que vous souhaitez modifier les instances de mélanger dans un module particulier:

array.each{ |o| o.extend(MyModule) } 

Par exemple:

Nib = Struct.new :val do 
    def to_s 
    value # Must be implemented by instance/subclass 
    end 
end 

module Nib::Precise 
    def value; "%.1f" % val; end 
end 

module Nib::Rough 
    def value; val.round.to_s; end 
end 

module Nib::Ballpark 
    def value; ((val/10).round * 10).to_s; end 
end 

nibs = [ Nib.new(33.7), Nib.new(29.1) ] 

nibs.each{ |n| n.extend(Nib::Precise) } 
p nibs.join(", ") #=> "33.7, 29.1" 

nibs.each{ |n| n.extend(Nib::Rough) } 
p nibs.join(", ") #=> "34, 29" 

nibs.each{ |n| n.extend(Nib::Ballpark) } 
p nibs.join(", ") #=> "30, 30" 
+1

J'ai modifié ma réponse en fonction de votre commentaire sur @LarryK; est-ce ce dont vous aviez besoin? – Phrogz

+0

Incroyable, c'est parfait ... merci! –

0

Le « formatage » des méthodes devrait probablement être dernier. Par exemple

case :xml 
    @data1.foo.to_xml #foo = 4 
case :web_table 
    @data1.foo.to_web_table #foo = "four" 
.... 

Vous devrez mélanger les méthodes de formatage aux classes de base ou à Object.

Les méthodes de mise en forme peuvent examiner la classe de la classe parente et décider comment convertir la valeur.

+0

C'est dans le sens de ce que je cherche, mais comment inclure dynamiquement le mixin? –

Questions connexes