【发布时间】:2013-04-24 22:11:05
【问题描述】:
我有一个父文档并且我想要两种不同类型的嵌入文档:一种作为父文档,另一种作为具有可选父文档的子文档。例如:
class ParentDoc
include Mongoid::Document
embeds_many :special_docs
embeds_many :special_doc_groupings
end
class SpecialDoc
include Mongoid::Document
embedded_in :parent_doc
belongs_to :special_doc_groupings
end
class SpecialDocGrouping
include Mongoid::Document
embedded_in :parent_doc
has_many :special_docs
end
在本例中,SpecialDocs 和 SpecialDocGroupings 可以不存在关系,也可以有父子关系。
但是,这是一个无效的 Mongoid 关联,因为我们收到此错误:
Mongoid::Errors::MixedRelations:
问题: 由于嵌入了 SpecialDoc,因此不允许通过关系关联从 SpecialDocGrouping 文档中引用 (n) SpecialDoc 文档。
总结: 为了从 SpecialDocGrouping 正确访问一个(n)SpecialDoc,引用需要通过 SpecialDoc 的根文档。在一个简单的情况下,这将需要 Mongoid 为根存储一个额外的外键,在更复杂的情况下,SpecialDoc 是多个级别的深度,则需要为层次结构中的每个父级存储一个键。
分辨率: 考虑不嵌入 SpecialDoc,或者在应用程序代码中以自定义方式进行密钥存储和访问。
我认为我尝试创建的关联类型没有任何问题,除了 Mongoid 不支持它。
我如何自己实现这种类型的关联?
【问题讨论】:
-
是的,你的权利,你不能在 mongoid 中定义这种类型的关联,关于你的问题`我自己实现这种类型的关联?`在 activerecord 关联中听说过extend,你可以实现类似的东西如果 mongoid 也支持这种类型的东西,或者使用扩展(我会检查并让你知道这个)干杯