2011-04-14 81 views
3

假设我在HABTM环境中有两个独立的模型User和Event。构建Mongoid中的复杂关系

现在我想扩展它以包含有关关系的信息。事情就像用户计划参加活动一样。

在标准的ActiveRecord中,这将通过has_many:through关系来完成,但是从我一直在阅读的内容来看,尝试在mongoid中创建这种关系是一个坏主意。解决这个问题的好方法是什么? (与蒙戈住)

这里是我期望这种类型的功能的示例:

class User 
    field :name 
    has_many :user_events 
    has_many :events, :through => :user_events 
end 

class Event 
    field :title 
    has_many :user_events 
    has_many :users, :through => :user_events 
end 

class UserEvent 
    field :attending?, :type => Boolean 
    belongs_to :users 
    belongs_to :events 
end 

回答

3
class User 
    include Mongoid::Document 

    field :name 
    embeds_many :user_events 
end 

class UserEvent 
    include Mongoid::Document 

    belongs_to :event 
    embedded_in :user 

    field :attending?, :type => Boolean 
end 

class Event 
    include Mongoid::Document 
    field :title 
end 

为了找到的所有事件,其中用户正关注:

user = User.where(:name => 'Joe').first 
user.user_events.where(:attending? => true) 

有关完整的示例,请参阅此gist

+0

这与我很薄国王也是。然后在用户中加入一个包装方法,例如get_events()来抽象该user.user_events.events查询。我希望有这种类型的关系发展的最佳做法。 – agentargo 2011-04-14 14:53:36

+1

的确,您可能还想看看http://www.mongodb.org/display/DOCS/Schema+Design。重要的一点是:“订单项明细对象通常是嵌入式的。”。希望有所帮助。 – Matt 2011-04-17 11:33:05