2011-07-15 126 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你應該看到ItemType,因爲它使用你設置的class_name來確定使用的類。

它也可能只是一個疏忽,我沒有看到在Mongoid的GitHub上的這些行上發佈的任何錯誤。你應該在https://github.com/mongoid/mongoid/issues上公佈,並告知他們,以防止它只是一個簡單的疏忽。

+0

是啊,這是可能的力量。我發現Mongo Mapper確實在某種程度上強制執行了這些關聯約束,所以現在就玩這個。 – Mynock

-1

想到CLASS_NAME並不意味着驗證,只是重寫

指示mongoid該項目應該在的ItemType類的反向關係 ,而不是所謂的ExtraField

是蒙戈不類天生有驗證,但ActiveRecord的並不真正添加約束的基礎數據庫或者

像所有的東西紅寶石,對付我們給出