2011-06-18 69 views
6

的方案是:兩個1 - 中Mongoid(滑軌)N關係

如何帳戶轉到另一個帳戶給收視率?這導致帳戶中有兩個列表。那些我評價過的人和那些評價過我的人。 (my_ratings和ratings_given)

這可以歸結爲:

怎樣才能多1 - N的relationsips在Mongoid同一實體的工作?

In Mongoid's Docs它表示您可以使用has_manybelongs_to將實體鏈接在一起。

我現在有這對帳戶

has_many :ratings, :as => "my_ratings" 
    has_many :ratings, :as => "ratings_given" 

,這對評級

belongs_to :user, :as => 'Rater' 
belongs_to :user, :as => 'Ratie' 

該文檔不包括這種情況下,所以我想你會分化兩者之間用:as作爲參數。

這是甚至遠程正確?

回答

18

你可以達到你想要使用CLASS_NAME和inverse_of選項是什麼:因爲我是它最後的工作,所以我不知道這是否仍是推薦的方法

class Account 
    include Mongoid::Document 
    field :name 
    has_many :ratings_given, :class_name => 'Ratings', :inverse_of => :rater 
    has_many :my_ratings, :class_name => 'Ratings', :inverse_of => :ratee 
end 

class Ratings 
    include Mongoid::Document 
    field :name 
    belongs_to :rater, :class_name => 'Account', :inverse_of => :ratings_given 
    belongs_to :ratee, :class_name => 'Account', :inverse_of => :my_ratings 
end 

的文件已經改變。看起來它沒有在1-many referenced page上提及這些選項。但是如果你看看relations上的一般頁面,他們就會被覆蓋。

在任何情況下,當有兩個關聯到同一個類時,您需要顯式地鏈接ratings_given/rater和my_ratings/ratee關聯,否則mongoid無法知道選擇哪個可能的反向。

+0

重要的是要注意,當你有多個關係時,所有人都必須在雙方都得到一個:inverse_of聲明。否則,mongoid會感到困惑。 –