2012-08-28 2 views
0

Je développe une application avec ROR, MongoDB et Mongoid. Monapplication a deux modèles: team et matchModélisation de données de tournoi avec MongoDB et Rails

Le modèle match a deux documents away_home et home_team. Ma question est: Comment faire la relation entre teams et match?

Dois-je utiliser has_and_belongs_to_many?

Merci. Pourquoi n'essayez-vous pas d'avoir les deux équipes en tant que documents incorporés?

Répondre

3

@Emily solution S fonctionnerait, mais si vous avez l'intention d'interroger beaucoup pour les équipes directement, il va y avoir des problèmes certains, comme vous demandez les documents incorporés, et vous feriez mieux de les avoir comme documents racine.

Il y a un poste assez similaire sur le SO ici Mongoid - two fields inverses of the same foreign field

Si cela ne fonctionne pas pour vous, j'arrive d'avoir aussi des équipes et les matches :). Ce que je fais, puisque les identifiants d'équipe sont statiques dans mon cas, c'est que j'ai deux champs pour l'équipe à domicile et à l'extérieur, les indexer et les utiliser pour interroger les équipes dont j'ai besoin. Pas la meilleure solution peut-être, mais ça marche.

+1

Je suis d'accord avec cela - vous pouvez également avoir des équipes à la maison et à l'extérieur des liens vers des documents de haut niveau dans une collection d'équipes. Tout dépend de la façon dont vous voulez accéder à ces données. Si vous n'accédez jamais aux données d'une équipe en dehors du contexte d'une correspondance, vous pouvez utiliser un document incorporé. –

3

Par exemple, vous pourriez faire quelque chose comme ceci:

class Match 
    include Mongoid::Document 
    embeds_one :away_team, :class_name => "Team" 
    embeds_one :home_team, :class_name => "Team" 
end 


class Team 
    include Mongoid::Document 
    field :name, type: String 
    embedded_in :match 
end 

vous pouvez ensuite créer le match comme celui-ci:

> m = Match.new 
> t = Team.new 
> m.away_team = t 
> m.away_team.name = "yankees" 
> m.save 
> t = Team.new 
> m.home_team = t 
> m.home_team.name = "blue jays" 
> m.save 

Votre document serait alors ressembler à ceci

> db.matches.find().pretty() 
{ 
    "_id" : ObjectId("503d2e123005c811cc000001"), 
    "away_team" : { 
     "_id" : ObjectId("503d2e143005c811cc000002"), 
     "name" : "yankees" 
    }, 
    "home_team" : { 
     "_id" : ObjectId("503d2e303005c811cc000003"), 
     "name" : "blue jays" 
    } 
} 
+0

Merci @Emily S votre exemple a aussi fonctionné! –