2011-11-08 3 views
1

ラッパーが組み込まれたデータベースからフィールドを取得する場合は、オブジェクトの配列としてデータを受け取ります。各オブジェクトには、呼び出し可能な一連のインスタンスがあります。ですから、例えば:インスタンスのメソッドをオーバーライドする最善の方法は何ですか?

class DataWrapper 
    attr_reader :foo, :bar 
end 

、データが返されるように@data [1-3] DataWrapperのすべてのインスタンスがどこにある[DATA1、DATA2の@、@データ3、など@]。

どのようなコンテキストが使用されるのか、どのようにフォーマットしたいのかを知る前に、そのデータを受け取ったらどうなりますか?あなたがBaseClassののオブジェクトの配列を持っている、と後でいくつかのようにインスタンスを変異させたいようですね、このような

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

答えて

1

などの特定のコンテキストを、与えられたデータをフォーマットするための最良の(非Railsの)方法は何ですかBaseClassのサブクラスです。あなたはこれをすることはできません。代わりに、それぞれの "サブクラス"表現のモジュールを作成し、必要に応じてそれらをインスタンスに混在させることができます。

あなたがオブジェクトの配列を持っていて、特定のモジュールでミックスするインスタンスを変更する場合:たとえば

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

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

あなたのコメントを@LarryKに基づいて編集しました。これはあなたが必要としたものですか? – Phrogz

+0

驚くべき、それは完璧です...ありがとう! –

0

「書式設定」の方法は、おそらくする必要があります最終。例:

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

フォーマッティングメソッドを基本クラスまたはObjectにミックスする必要があります。

フォーマットメソッドは、親クラスのクラスを調べ、値の変換方法を決定できます。

+0

これは私が探しているラインに沿っていますが、mixinをどのように動的に組み込むのですか? –

関連する問題