我正在开发Rails应用程序,我从外部接收数据并将其存储在MongoDB中,我使用Mongoid作为ODM。
任务非常简单:我有Topic
模型应该拥有并且属于许多Rubrics
,这里的主要问题是应该嵌套rubrics(虽然是一个级别)。
我遇到的第一个解决方案是:
models/rubric.rb
class Rubric
include Mongoid::Document
recursively_embeds_many
has_and_belongs_to_many :topics
end
models/topic.rb
class Topic
include Mongoid::Document
has_and_belongs_to_many :rubrics
end
赞成
存储在自己的集合中的Rubric,因此很容易更新它们的属性(假设我需要编辑rubric的标题)。
缺点
Mongoid不允许我从主题访问嵌套的规则,即:topic.rubrics返回所有但嵌套的规则,这基本上是正确的 - mongoid不应该允许访问嵌入的文件来自外部。
不工作。
第二个解决方案:
models/rubric.rb
class Rubric
include Mongoid::Document
recursively_embeds_many
embeded_in :topic
end
models/topic.rb
class Topic
include Mongoid::Document
embeds_many :rubrics
end
赞成
Mongo方式?将所有与集合相关的数据存储在该集合中。
缺点
Rubric不是完全独立的集合,如果我需要更改量规,我有遍历所有主题更改量规。
Mongoid不允许我从主题访问嵌套的规则,即:topic.rubrics返回所有但嵌套的规则,这基本上是正确的 - mongoid不应该允许访问嵌入的文件来自外部。
不是非常干的解决方案,因为标题会在主题中重复。
不工作。
第三种解决方案:
models/rubric.rb
class Rubric
include Mongoid::Document
recursively_embeds_many
embeded_in :topic
end
models/subrubric.rb
class Subrubric
include Mongoid::Document
belongs_to :rubric
belongs_to :topic
end
models/topic.rb
class Topic
include Mongoid::Document
has_many :rubrics
has_many :subrubrics
end
赞成
唯一的好处是这个解决方案是唯一真正有效的解决方案,但是:
缺点
此方法仅在Rubric仅嵌套一次时才有效(对于此项目可以)。但是我想拥有适用于任何嵌套级别的通用解决方案。