2011-11-28 56 views
3

假設我們有兩個模型,任務和用戶。 所以用戶可以有很多任務,任務也應該能夠擁有很多用戶。但是,任務也應該有一個獨特的創造者,他也是一個用戶。MongoMapper:我如何創建一個這樣的模型

例:

這方面的一個任務是這樣的: 任務ID,任務創建者,誰應該做任務

USER_1創建一個任務,他是那麼的創造者用戶。 User_1將User_2和User_3指定爲應執行此任務的用戶。所以這兩個最後用戶不是任務的創造者。

如何創建這個模型,以便如果我有一個任務對象,我可以找到它的創建者和用戶誰應該完成它。如果我有用戶,我該怎麼做才能找到他創建的所有任務以及完成的所有任務。

+0

可能重複http://stackoverflow.com/questions/4253496/mongodb-relationships-for-對象) –

+0

不是重複的 – Tilo

回答

2

您需要在任務和用戶之間建立多對多關係,並且您需要在用戶和任務之間建立額外的一對多關係,指向創建者(用戶)。

沿着這些線路

東西(我通常使用Mongoid,因此請仔細檢查了MongoMapper API中關係中的語法 - 低於..你可能會手動指定鏈接:foreign_key和:類)

的想法是你在模型之間有兩種關係,一種是模擬多對多關係 ,您可以使用它與assigned_usersassigned_tasks以及一對多的關係,您可以通過它與creator任務,或給定用戶的created_tasks。如果你爲這些關係選擇了這些名字,它將清楚哪個是哪個。

class Task 
    include MongoMapper::Document 
    key :title, String , :required => true 

    key :user_ids , Array 
    has_many :users, :in => user_ids  # , :as => :assigned_users 

    key :creator_id , ObjectId 
    belongs_to: user, :as => :creator 

end 

class User 
    include MongoMapper::Document 
    key: name, String, :required => true 

    has_many :tasks   # , :as => :assigned_tasks 

    has_many :tasks, :as => :created_tasks 
end 

參見:

http://mongomapper.com/documentation/plugins/associations.html

+0

是啊,你必須指定':foreign_key'和':class'。 –

2

通過的Tilo建議的答案是關於如何對數據模型是正確的,但示例代碼不正確,將無法正常工作。 :as選項用於polymorphic associations,您想要使用:foreign_key選項。而且,你不能有兩個相同的關聯。請參閱下面的修訂代碼。

class Task 
    include MongoMapper::Document 
    key :title, String , :required => true 

    key :assigned_user_ids, Array 
    has_many :assigned_users, :in => :assigned_user_ids 

    key :creator_id , ObjectId 
    belongs_to :creator, :class => User 
    # userstamps! also accomplishes the above 
end 

class User 
    include MongoMapper::Document 
    key: name, String, :required => true 

    has_many :created_tasks, :foreign_key => :creator_id, :class => Task 

    # inverse of many :in is still in the works 
    # see https://github.com/jnunemaker/mongomapper/pull/259 
    # this is a decent workaround for now 
    def assigned_tasks 
    Task.where(:assigned_user_ids => self.id) 
    end 
end 

參見:

的[對對象的MongoDB關係](