2011-09-13 5 views
4

MongoDB를 db로 사용하여 이벤트 플랫폼을 만들려고합니다. EventsUsers 사이에 다 대다 관계가 필요합니다. 문제는 관계에 속성이 있어야합니다 (예 : Users은 특정 Event에 대해 확인되거나 확인되지 않음). 이것이 RDBMS에 이상적이라고 생각합니다. 그러나 MongoDB를 사용하여 다른 곳에서 이점을 얻고 있으며 계속 사용하고 싶습니다.시뮬레이션 has_many : through Mongoid

나는 각각 EventGuests, Users에 속하는 다수를 포함시키고 싶습니다. 그렇게하면 어떤 사용자가 이벤트에 신속하게 참석하고 하나의 쿼리 만 사용하는지 확인할 수 있습니다. 그러나 어느 EventsUser이 신속하게 참석하고 있는지 알고 싶습니다. 따라서 각 UserEvent ID가 필요합니다.

다음은 코드 요약입니다. 이상적인 사용 패턴

# user of the application 
class User 
    has_many :events 
end 

# event that users can choose to attend 
class Event 
    embeds_many :guests 
    has_many :users, :through => :guests  # Won't work 
end 

# guests for an event 
class Guest 
    field :confirmed?, type: Boolean 

    embedded_in :event 
    belongs_to :user 
end 


# Ideal use pattern 
u = User.create 
e = Event.create 
e.guests.create(:user => u, :confirmed => true) 

, euu 참조와 Guest을 갖는다 e에 대한 참조를 갖는다.

내가 알고있는 has_many :through 라인이 작동하지 않습니다. 유사한 기능을 얻는 방법에 대한 제안 사항이 있습니까? Guestafter_create 콜백을 사용하여 Event에 대한 참조를 User에 추가하는 방법을 생각했지만 상당히 엉뚱한 것 같습니다.

어쩌면 잘못된 길을 갔을 수도 있습니다. 제안? 감사.

답변

3

이벤트 ID는 사용자의 배열에 저장할 수 있습니다.

이벤트가 변경되거나 사용자가 어떤 이유로 이벤트에서 제거 될 때 배열을 관리해야합니다. 그러나 그것은 상쇄 관계에 있습니다.

사용자 이벤트는 단일 db 호출로 찾을 수 있습니다.

연관을 관리하려면 observers을 (를) 찾아보십시오.

+0

방금 ​​귀하의 답변을 보았습니다. 나는 내 문제를 해결하는 방법을 게시했지만 관찰자를 사용하는 것이 더 깔끔했을 것이다. 감사! – cbrauchli

+0

안녕하세요, nodrog, 링크가 깨졌습니다. –

2

모델에서 콜백을 사용하여 원하는 결과를 얻었습니다. 여기에 그 모습이 있습니다.

편집 : 방금 ​​nodrog의 대답을 보았습니다. 예, 관측자를 사용하면 아마도 깔끔했을 것입니다. 나는 그들에 대해 몰랐습니다. 감사!

# user of the application 
class User 
    has_and_belongs_to_many :events, inverse_of: nil, dependent: :nullify 
end 

# event that users can choose to attend 
class Event 
    embeds_many :guests 
    index 'guests.user_id', unique: true 
    before_destroy :cleanup_guest_references 

    def cleanup_guest_references 
    self.guests.each do |guest| 
     guest.destroy 
    end 
    end 
end 

# guests for an event 
class Guest 
    field :confirmed?, type: Boolean 

    embedded_in :event, :inverse_of => :guests 
    belongs_to :user 

    after_create :add_event_for_user 
    before_destroy :remove_event_for_user 

    private 
    def add_event_for_user 
     self.user.events.push(self.event) 
    end 
    def remove_event_for_user 
     self.user.events.delete self.event 
     self.user.save 
    end 
end 
+0

누군가 이런 식으로하는 것이 가장 좋은 방법이라고 말할 수 있습니까? –

+0

콜백이 의미가 있다고 생각합니다. 관찰자들과 매우 비슷합니다. – kgpdeveloper

관련 문제