我正在使用带有mongoid的Ruby on Rails 3.1并尝试在帖子,评论,用户和标签之间建立一个相当简单的关系。 我对mongodb很新,而且一般都没有sql所以我有点困惑。
我想要完成的是: 用户,帖子和评论应该能够有多个标签。 标签应具有名称,类型以及使用次数的计数。 我需要能够获得所有可用的标签,以便用户可以从中进行选择。 反之,能够从用户,帖子和评论中检索标签。
我已经阅读了很多关于它的内容,但似乎无法弄清楚我应该采取哪种方法。我应该使用参考或嵌入式关系吗? 我看了几个宝石,但似乎没有人像我上面描述的那样工作。
旁注:稍后我将使用Tire作为我的搜索功能。
答案 0 :(得分:7)
很酷,欢迎来到MongoDB!这很难做对,取决于你的应用程序,但我会尝试根据你写的内容和我认为最有效的方法给你一些指示。
情况并非总是如此,但一般理论是如果一个对象总是被操纵并在另一个对象的上下文中查看,那么你应该将它嵌入到该对象中。这可能可能在您的应用程序中包含注释和帖子的情况。因此,您可能希望在帖子中嵌入评论。
但是,因为您在多个上下文中使用标记对象,所以我会将它作为自己的集合,如下所示:
class Tag
include Mongoid::Document
field :tag, type: String
field :type, type: String
field :count, type: Integer
end
让我们按照您的要求运行并构建模型。
标签应包含名称,类型以及使用次数的计数。
通过上面的Tag类代码完成。
用户,帖子和评论应该有多个标签。
好的,让我们给这些类中的每一个一个“标签”字段,该字段有一个标签ID数组,这将是一个参考关系。
class User
include Mongoid::Document
field :first_name, type: String
field :last_name, type: String
field :email, type: String
field :tags, type: Array
end
此外,我们将在帖子中嵌入评论,同时拥有标签ID数组,就像我们为用户所做的那样。
class Post
include Mongoid::Document
field :subject, type: String
field :body, type: String
field :tags, type: Array
embeds_many :comments
end
class Comment
include Mongoid::Document
field :name, type: String
field :type, type: String
field :count, type: Integer
embedded_in :post
end
有意义吗?在Rails中建模这些种类关系时有一些更多的信息here,但是使用mongomapper而不是mongoid(所以不要注意语法,而要注意所提出的想法)