2011-11-24 28 views
1

我正在使用Ruby on Rails 3.1和mongoid,并试图在帖子,评论,用户和标签之间建立som相当简单的关系。 我对mongodb很陌生,一般来说没有sql,所以我有点困惑。我试图完成的是: 用户,帖子和评论应该能够有多个标签。 标签应该有名称,类型和使用次数。 我需要能够获得所有可用的标签,以便用户可以从中选择。 反过来,能够从用户,帖子和评论中检索标签。与mongoid的关系,我应该使用什么?

我读过很多关于它的知识,但似乎无法弄清楚我应该采取哪种方法。我应该使用参考或嵌入关系吗? 我已经看过几个宝石,但似乎没有人像我上面描述的那样工作。

旁注:我将在稍后使用Tire作为我的搜索功能。

回答

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的关系,这些种种,但使用mongomapper代替mongoid(所以不要注重语法,但要注意提出的想法)在你的答案

+1

很好的细节,详细信息here +1 – Xorlev

+0

谢谢!希望蒂姆能从中获得一些东西。 –

+1

非常感谢您提供详细的解答!这正是我想要的。感觉这可能需要一些时间来解决“蒙戈的思维方式”。我发现自己一直在想它......再次感谢你,这对我有很大帮助! –