2

我有几个模型,每个模型都有标签。例如,aUser和 a Post。我认为两者都应该有嵌入式标签。
用户的嵌入标签是他们的“最爱”,而帖子的标签是与帖子有关的标签。

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

当用户尝试添加标签时,会对其进行检查Tag.all以确保它存在。如果是这样,那么它应该嵌入到User模型中。

我不知道如何将标签模型嵌入多个模型(UserPost)或如何嵌入标签模型以及像正常一样检索它们(我收到错误:不允许访问标签的集合,因为它是嵌入文档,请从根文档访问集合。)。

想法?我设计这个完全错误吗?我不需要像“检索所有拥有example标签的用户”这样的复杂查询,所以我认为我应该嵌入以提高效率。

4

3 回答 3

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

然后,您可能会拥有一个包含所有可用标签的 auser或 a的实例。然后,您可以在实例上调用它,post而不是调用Tag 类.all

available_user = User.new
available_user.tags << Tag.new
available_user.tags.all
于 2012-05-16T00:12:09.513 回答
1

我的解决方案是拥有一个嵌入多个标签的注册表模型,然后拥有一个实例,该实例具有在添加到用户或帖子之前检查的已注册标签。这与 Ron 的答案基本相同,但不会重载 User。

于 2012-05-16T04:20:00.313 回答
0

首先,当您尝试获取嵌入标签时遇到的错误是正常的,这对于实际的 MongoDB 版本是不可能的。

我不是专家,但我可以向您推荐一个可行的解决方案:对UserPost使用嵌入式标签,并创建一个用于索引目的 的标签集合。

  • 当用户尝试添加标签时:调用Tag.all
    • 如果标签不存在:在用户标签中创建它
    • 如果是这样,只需将其嵌入到User中。

Post也是如此。

于 2012-05-15T21:10:15.130 回答