【问题标题】:Relations with mongoid, what should i use?与mongoid的关系,我应该使用什么?
【发布时间】:2011-11-24 09:53:48
【问题描述】:

我正在使用 Ruby on Rails 3.1 和 mongoid,并尝试在帖子、cmets、用户和标签之间建立一些相当简单的关系。 我对 mongodb 很陌生,而且一般没有 sql,所以我有点困惑。

我想要完成的是: 用户、帖子和 cmets 应该能够有多个标签。 标签应该有名称、类型和使用次数。 我需要能够获取所有可用的标签,以便用户可以从中选择。 反之,能够从用户、帖子和 cmets 中检索标签。

我已经阅读了很多关于它的内容,但似乎仍然无法弄清楚我应该采用哪种方法。我应该使用参照关系还是嵌入关系? 我看过一些宝石,但似乎没有一个像我上面描述的那样工作。

旁注:稍后我将使用Tire 进行搜索功能。

【问题讨论】:

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


    【解决方案1】:

    酷,欢迎来到 MongoDB!这很难做到正确,并且取决于您的应用程序,但我会尝试根据您编写的内容以及我认为最有效的内容为您提供一些指导。

    情况并非总是如此,但一般理论是,如果始终在另一个对象的上下文中操作和查看一个对象,则应将其嵌入该对象中。 可能在您的应用程序中使用 cmets 和 post。因此,您可能希望在帖子中嵌入 cmets。

    但是,因为您在多个上下文中使用标记对象,所以我会将其设为自己的集合,如下所示:

    class Tag
        include Mongoid::Document
        field :tag, type: String
        field :type, type: String
        field :count, type: Integer
    end
    

    让我们满足您的需求并构建模型。

    标签应该有名称、类型和使用次数。

    通过上面的 Tag 类代码完成。

    用户、帖子和 cmets 应该可以有多个标签。

    好的,让我们给每个类一个“标签”字段,其中包含一个标签 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
    

    此外,我们将在帖子中嵌入 cmets 以及我们为用户所做的标签 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
    

    有意义吗? here 有更多关于在 Rails 中建模这类关系但使用 mongomapper 而不是 mongoid 的信息(所以不要注意语法,但要注意提出的想法)

    【讨论】:

    • 你的回答很详细,+1
    • 谢谢!希望蒂姆能从中有所收获。
    • 非常感谢您提供详细而出色的解释性答案!这正是我想要的。感觉可能需要一些时间才能绕过“mongo 思维方式”。我发现自己一直在想它……再次感谢您,这对我很有帮助!
    • 没问题蒂姆。我自己还在习惯它,并且 mongoid 将其中的一些抽象出来,所以只要你知道幕后发生的事情就可以了。
    猜你喜欢
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多