2011-04-14 3 views
3

Disons que j'ai deux modèles séparés Utilisateur et événement dans un environnement HABTM.Structuration des relations complexes dans Mongoid

Maintenant, je veux étendre cela pour inclure des informations sur la relation. Des choses comme si l'utilisateur prévoit d'assister à l'événement.

Dans ActiveRecord standard, ceci serait fait avec une relation has_many: through, mais d'après ce que j'ai lu, c'est une mauvaise idée d'essayer de créer ce type de relation dans mongoid. Quel est un bon moyen d'aborder ce problème? (Rester avec mongo)

Voici un exemple de ce que j'attendais pour ce type de fonctionnalité:

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 

Répondre

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 

Afin de trouver tous les événements où l'utilisateur est Présences:

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

Pour un exemple complet, voir ceci gist

+0

Ceci est dans la même ligne que j'étais mince roi aussi. Ensuite, placez une méthode wrapper dans User comme get_events() pour résumer cette requête user.user_events.events. J'espérais qu'il y avait une meilleure pratique pour ce type de relation développé. – agentargo

+1

Exactement, vous pouvez également jeter un oeil à http://www.mongodb.org/display/DOCS/Schema+Design. Le point important est "Les objets de détail des éléments de ligne sont généralement intégrés.". J'espère que cela pourra aider. – Matt

Questions connexes