2013-07-29 135 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