我有一些模型,每个都有标签。比如说User
和Post
。我认为两者都应该有嵌入式标签
用户的嵌入式标签是他们的“收藏夹”,帖子的标签是与帖子有关的标签。
我正在使用Mongoid,我无法弄清楚如何拥有一个Tag
模型,我可以找到所有标签(这些标签没有嵌入,我想要一个单独的所有可用标签的集合)。
当用户尝试添加标记时,会针对Tag.all
对其进行检查以确保其存在。如果是,则应将其嵌入User
模型中。
我无法弄清楚如何在多个模型(User
和Post
)中嵌入Tag模型,或者如何嵌入Tag模型以及像普通模型一样检索它们(我得到了错误) :不允许访问Tag的集合,因为它是嵌入式文档,请从根文档访问集合。)。
想法?我设计这个完全错了吗?我不需要复杂的查询,例如“检索所有拥有example
标记的用户”,因此我认为我应该将其嵌入以提高效率。
答案 0 :(得分:3)
嗯,第一步是使标记成为多态嵌入。
class User
embeds_many :tags, :as => :taggable
end
class Post
embeds_many :tags, :as => :taggable
end
class Tag
embedded_in :taggable, :polymorphic => true
end
然后,您可能会拥有一个包含所有可用标记的user
或post
的实例。然后,您可以在实例
.all
available_user = User.new
available_user.tags << Tag.new
available_user.tags.all
答案 1 :(得分:1)
我的解决方案是拥有一个embeds_many标记的注册表模型,然后在添加到用户或帖子之前拥有一个具有已注册标记的实例。这与Ron的回答基本相同,但没有超载User。
答案 2 :(得分:0)
首先,当您尝试获取嵌入式标记时出现的错误是正常的,这对于实际的MongoDB版本是不可能的。
我不是专家,但我可以为您推荐一个可行的解决方案:为用户和发布使用嵌入式标签,并创建标签集合,您将用于索引目的。
Tag.all
Post 也是如此。