2011-11-24 35 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

非常感謝您提供詳細的解答!這正是我想要的。感覺這可能需要一些時間來解決「蒙戈的思維方式」。我發現自己一直在想它......再次感謝你,這對我有很大幫助! –