2012-03-30 4 views
0

は、私はこのようになりますMongoMapperクラスに取り組んでいるとしますMongoMapperのオプションキーまたはキャッチオールキーを使用しますか?

class Animal 
    include MongoMapper::Document 

    key :type, String, :required => true 
    key :color, String 
    key :feet, Integer 
end 

今、私は鳥の翼幅を保存したいです。多くのドキュメントには無関係だと少しだらしない感じにもかかわらず、これを追加する方が良いでしょう:

key :wingspan, Float 

またはこの、それはindescriptiveキャッチオールハックのように感じていることだにもかかわらず:

key :metadata, Hash 

メタデータアプローチ(私が継承しているコードには先例があります)は、Mongoドキュメント全体にとってはほとんど冗長です。両方とも、キーと値のペアのスキーマレスバケットを意図しています。

動物固有のキーを追加すると、かなり醜いモデルに滑りやすい斜面であるようにしかし、それにも思えます。

代替手段(Birdサブクラスを作成する)はありますか?

答えて

1

MongoMapperはnilというキーを格納しないため、key :wingspanを定義した場合、実際にそのキーを設定したドキュメントのみが格納されます。

あなたがキーを定義しないように選択した場合、あなたはまだmy_bird[:wingspan] = 23でそれを設定/取得することができます。 ([]呼び出しは実際にあなたのためにキーを自動的に定義します;同様に明示的に定義されていないキーを使ってMongoDBからドキュメントが戻ってきた場合、キーとそのクラスのすべてのドキュメントが定義されます。それは全体のクラスのためですが、nilのキーは保存されていないので、それほど大きな問題ではありません。)

birdにも独自の振る舞いがある場合(おそらくそうです)、サブクラスが理にかなっています。鳥と動物については、すべての鳥が動物であるので、私はこのルートをとるだろう。あなたは億移行あなたのコードを必要としないので、MongoDBはどのクラスで行く属性それは明らかに、Single Table/Single Collection継承のためのActiveRecordよりもはるかに進歩しています。

+0

興味深い - 私はちょうど遊んで、未定義のキーが実際に格納され、取得されたことを確認しました。それでは、あなたのモデルでキーを定義する点は何でしょうか?(デフォルトの設定と:required => true以外の)? – Ross

+0

さて、 'key'コールは' def my_attr'と 'def my_attr ='を実行しますので、 'bird.wingspan'を実行できます。未定義のキーの場合、 'key'はオブジェクトがデータベースからロードされるまで呼び出されません_したがって、あなたのアプリケーションが寒い場合(例えばテスト)、' Bird.new.wingspan'は 'key:wingspan' hasnのため' NoMethodError'を送出しますまだ起こっていない。 –

1

それはあなたが将来的にデータベースとどのようにあなたが保存した情報を使用することを期待を拡張しようとする方法を知らなくても良い答えを与えることは難しいです。たくさんの鳥を飼っていて、翼幅に要約したければ、翼幅は他の動物には使われなくても助けになります。既知の動物ごとにランダムな任意の情報を格納する予定がある場合は、スキーマ内で追跡する可能性があまりにも多くあり、メタデータのアプローチが使いやすくなります。

関連する問題