Ruby on rails Mongoid嵌入了许多类型约束

Ruby on rails Mongoid嵌入了许多类型约束,ruby-on-rails,mongoid,type-constraints,Ruby On Rails,Mongoid,Type Constraints,我试图在mongoid中创建一个Embeddes_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

我试图在mongoid中创建一个Embeddes_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"
类项目
include Mongoid::Document
嵌入多个:额外字段,类名称:“ItemType”
结束
类ItemType
include Mongoid::Document
嵌入在:项中
字段:键入名称
结束
类别
include Mongoid::Document
嵌入多个:schema\u字段
领域:乌合之众
结束
ruby>Item.delete\u all
=> 1 
ruby>item=item.new
=> # 
ruby>item.extra_字段“derp”)
=> [#] 
ruby>item.save
=>正确
ruby>item=item.first
=> # 
ruby>item.extra_字段[0]。rabble
=>“derp”

由于MongoDB是无模式的,所以Mongoid不一定要强制执行添加的类类型。在您的示例中,您只转储
项.extra_字段[0]。rabble
,它被设置为
derp
。因为它是无模式的,所以在MongoDB中保存一个存在于一个模型中但不存在于另一个模型中的字段并不是一个严重的失败。如果执行
item.extra_字段[0].class
操作,则应查看
ItemType
,因为它使用您设置的
class_名称来确定使用的类


这也可能只是一个疏忽,我在GitHub for Mongoid上没有看到任何类似的bug。你应该把它发布在,并让他们知道,以防这只是一个简单的疏忽。

认为类名并不是为了验证,只是一个覆盖

向mongoid指示项应在ItemType类中查找反向关系 而不是一个叫做ExtraField的类

是的,Mongo没有固有的验证功能,但是ActiveRecord也没有真正向底层数据库添加约束


像所有的东西一样,Ruby,处理我们被赋予的力量

是的,这是可能的。我发现Mongo Mapper确实在一定程度上强制执行了这些类型的关联约束,所以现在就开始玩吧。