Mongoid embeds_many类型约束

时间:2011-07-15 21:04:42

标签: ruby-on-rails mongoid type-constraints

我正在尝试在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"

2 个答案:

答案 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一样,处理我们给予的力量