2011-11-28 1 views
3

작업과 사용자라는 두 가지 모델이 있다고 가정 해 보겠습니다. 그래서 사용자는 많은 작업과 작업을 할 수 있어야하므로 많은 사용자를 가질 수 있어야합니다. 그러나 작업에는 사용자이기도 한 고유 한 제작자가 있어야합니다.MongoMapper :이 모델을 어떻게 만듭니 까?

Exemple :

이러한 맥락에서의 작업은 다음과 같이이다 : 작업 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와 : 클래스)

아이디어 두 모델 사이에 두 개의 관계가 있다는 것입니다. 하나는 many-to-many 관계를 모델링하고 은 assigned_users 또는 assigned_tasks이고, one-to-many 관계는 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 

참조 :는 Tila 제안

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

+0

예,': foreign_key'와': class'를 지정해야합니다. –

2

대답은 데이터를 모델링하는 방법에 대한 정확하지만 예제 코드가 잘못이며 작동하지 않습니다. :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의 관계 (