Mongoid和嵌入标签

时间:2012-05-15 20:53:18

标签: ruby-on-rails ruby mongodb mongoid nosql

我有一些模型,每个都有标签。比如说UserPost。我认为两者都应该有嵌入式标签 用户的嵌入式标签是他们的“收藏夹”,帖子的标签是与帖子有关的标签。

我正在使用Mongoid,我无法弄清楚如何拥有一个Tag模型,我可以找到所有标签(这些标签没有嵌入,我想要一个单独的所有可用标签的集合)。

当用户尝试添加标记时,会针对Tag.all对其进行检查以确保其存在。如果是,则应将其嵌入User模型中。

我无法弄清楚如何在多个模型(UserPost)中嵌入Tag模型,或者如何嵌入Tag模型以及像普通模型一样检索它们(我得到了错误) :不允许访问Tag的集合,因为它是嵌入式文档,请从根文档访问集合。)。

想法?我设计这个完全错了吗?我不需要复杂的查询,例如“检索所有拥有example标记的用户”,因此我认为我应该将其嵌入以提高效率。

3 个答案:

答案 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

然后,您可能会拥有一个包含所有可用标记的userpost的实例。然后,您可以在实例

上调用它,而不是在Tag类上调用.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 也是如此。