2011-07-15 8 views
0

mongoidにembeds_many関係を作成しようとしていますが、コレクションに追加するオブジェクトに型制約を強制していないようです。私はここで間違っていることをやっているのですか?Mongoid embeds_manyタイプ制約

class Item 
    include Mongoid::Document 
    embeds_many :extra_fields, class_name: "ItemType" 
end 

class ItemType 
    include Mongoid::Document 
    embedded_in :item 
    field :type_name 
end 

class Category 
    include Mongoid::Document 
    embeds_many :schema_fields 
    field :rabble 
end 


ruby > Item.delete_all 
=> 1 

ruby > item = Item.new 
=> #<Item _id: 4e20a60a401b3e47d2000004, _type: nil> 

ruby > item.extra_fields << Category.new(:rabble => 'derp') 
=> [#<Category _id: 4e20a619401b3e47d2000005, _type: nil, rabble: "derp">] 

ruby > item.save 
=> true 

ruby > item = Item.first 
=> #<Item _id: 4e20a60a401b3e47d2000004, _type: nil> 

ruby > item.extra_fields[0].rabble 
=> "derp" 

答えて

0

MongoDBはスキーマレスなので、Mongoidが追加されたクラスのタイプを強制することは厳密には必要ではありません。あなたの例では、item.extra_fields[0].rabbleを投棄するだけです。それはderpに設定されています。それはスキーマレスなので、MongoDBでは重大な失敗ではありません。これは、あるモデルに存在するフィールドを保存しますが、他のモデルには存在しません。 item.extra_fields[0].classを実行すると、使用するクラスを決定するためにclass_nameを使用しているため、ItemTypeが表示されます。

これは単純に見落としに過ぎないかもしれませんが、私はMongoidのGitHubでこれらの行にバグが表示されることはありません。 https://github.com/mongoid/mongoid/issuesに投稿して、簡単な見落としがある場合にはお知らせください。

+0

を与えている力を扱う、すべてのもののような基礎となるデータベース

のいずれかのRubyに制約を追加しません。私は、Mongo Mapperがこれらの種類の関連性の制約をある程度強要していることを発見しました。 – Mynock

-1

はCLASS_NAMEを検証するものではありません、

は、その項目をmongoidすることを示していることだけオーバーライドが逆の関係 なくExtraField

と呼ばれるクラスのitemTypeにクラスになりますはいモンゴにはないと思います先天的に検証を持っていますが、ActiveRecordのは本当に我々はこれが可能であるうん