2013-07-29 103 views
1

我有像波紋管一樣的模型。我想通過賓客列表查詢具有不同類型狀態的用戶的事件。如果我沒有錯的客人名單應該嵌入事件?如果我的模型設計是錯誤的,我會爲不同的解決方案打開。Mongoid的帶有belongs_to關聯的嵌入式文檔

class User 
    include Mongoid::Document 

end 

class Events 
    include Mongoid::Document 

    embeds_many :guests 
end 

Class Guests 
    include Mongoid::Document 

    embed_in :event 
    belongs_to :user 

    field :status 

end 

回答

1

模型結構是錯誤的,因爲在Mongo你只保留信息,其中只需要在父文檔嵌入文檔。

如果客人你只有狀態字段,那麼你可以試試這個,例如,兩個狀態類型存在或不存在

class User 
    include Mongoid::Document 
    has_and_belongs_to_belongs_to :event, :inverse_of => "present_guests" 
    has_and_belongs_to_belongs_to :event, :inverse_of => "not_present_guests" 
end 

class Event 
    include Mongoid::Document 
    has_and_belongs_to_many :present_guests, :class_name => "User", :inverse_of => "present_guests" 
    has_and_belongs_to_has_many :not_present_guests, :class_name => "User", :inverse_of => "not_present_guests" 
end 

那麼你就可以像

Event.first.present_guests 
1

我相信模型結構會起作用。

下面是一個例子查詢來獲取與客人的所有事件與「等待」狀態:

Events.where('guests.status' => 'waiting') 

下面是另一個例子,給出一個事件,讓該事件的所有客人提供「等待」狀態:

event = Events.first # get the desired event 
event.guests.where(:status => 'waiting') 

最後,你應該命名你的模型單數名稱(用戶,事件,客人)。此外,您的客戶模型有一定的錯別字我下面固定:

class User 
    include Mongoid::Document 

end 

class Event 
    include Mongoid::Document 

    embeds_many :guests 
end 

class Guest 
    include Mongoid::Document 

    embedded_in :event 
    belongs_to :user 

    field :status 
end 
+0

狀態查詢我的問題是如何爲用戶顯示事件 – Georgi

+1

然後你應該遵循@abhas的建議。用上面的模型結構得到的最接近的是my_events = Event.where('guests.user_id'=> my_user_id)',這將爲您提供用戶作爲訪客的每個事件。然後,您必須迭代結果列表並找到你想要的狀態:'my_events.select {| e | eguests.where(:user_id => my_user_id,:status =>'waiting')。first}'。這遠不是最優的,所以你應該使用不同的模型方案。 – pgaspar

+0

感謝您的幫助和解釋。最好的祝福。 – Georgi