2011-09-13 32 views
4

我想創建一個使用MongoDB作爲數據庫的事件平臺。我需要EventsUsers之間的多對多關係。問題是,我希望在那裏有關係中的屬性(例如,Users可以被確認或未經確認,以用於特定的Event)。我意識到這將非常適合RDBMS,但我使用MongoDB的原因是我在其他地方佔據優勢,我寧願繼續使用它。模擬has_many:通過與Mongoid

我想爲每個Event嵌入很多Guests,它們屬於Users。這樣,我就可以快速查看哪些用戶正在參加一個活動,只有一個查詢。不過,我也想看看這Events一個User迅速出席,所以我想每個User擁有的Event 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) 

隨着理想的使用模式,e具有到uu的基準的Guest具有e的參考。

我知道has_many :through線將無法正常工作。有關如何獲得類似功能的任何建議?我想在Guest使用after_create回調添加到UserEvent參考的,但似乎相當哈克。

也許我走錯了路。建議?謝謝。

回答

3

您可以將事件標識存儲在用戶的數組中。

你有當事件的變化,或者用戶是從出於某種原因活動中移除管理陣列。但這是權衡。

User.events然後可以用一個單一的數據庫調用發現。

observers管理協會。

+0

我剛纔看到你的答案。我發佈瞭如何最終解決我的問題,但使用觀察員會更清潔。謝謝! – cbrauchli

+0

嘿,點頭,鏈接被打破。 –

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