我正在尝试在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 :(得分:0)
由于MongoDB是无模式的,所以Mongoid并不一定要强制执行添加的类类型。在您的示例中,您只是转储item.extra_fields[0].rabble
,它设置为derp
。由于它是无模式的,所以MongoDB中的一个关键故障并不是你要保存一个模型而不是另一个模型中存在的字段。如果您执行item.extra_fields[0].class
,则会看到ItemType
,因为它使用您设置的class_name
来确定所使用的类。
它也可能只是一个疏忽,我没有看到在GitHub上为Mongoid发布的任何错误。你应该在https://github.com/mongoid/mongoid/issues发布它,并告诉他们,以防它只是一个简单的疏忽。
答案 1 :(得分:-1)
认为class_name不是要验证,只是覆盖
表示对于反向关系,Item应该在ItemType类中查找 而不是名为ExtraField的类
是的,Mongo本身并没有验证,但ActiveRecord并没有真正为基础数据库添加约束
像所有Ruby一样,处理我们给予的力量