2010-11-08 6 views
6

J'ai besoin d'utilisateurs pour devenir des fans d'autres utilisateurs. Comment devrais-je concevoir/configurer ceci?Comment: L'utilisateur a des fans

Je dois pouvoir voir les détails des utilisateurs.

Par exemple. J'ai un utilisateur: Foo. Foo a 3 fans. J'aimerais pouvoir trouver les noms des fans de Foo. En tant que tel:

foo = User.first 
foo.name (returns 'Foo') 
foo.fans.first.user.name (should return 'bar', since 'bar' is a fan of 'foo') 

Voici comment je l'ai mis en place au moment:

User model: 
    embeds_many :fans 
    references_many :fans 

Fan model: 
    embedded_in :user, :inverse_of => :fans 
    referenced_in :user 

In console, I do: 
    User.first.fans.create!(:user => User.first) 

et je reçois: MongoId :: :: Erreurs InvalidCollection: L'accès à la collection pour Fan est non autorisé puisqu'il s'agit d'un document incorporé, accédez à une collection à partir du document racine. Je pense que le problème est, parce que le modèle de ventilateur est intégré dans le modèle de l'utilisateur qui a une auto-référence au modèle de l'utilisateur aussi ....

Vos pensées seront grandement appréciées.

Répondre

9

Que diriez-vous d'une association auto-référentiel:

class User 
    include Mongoid::Document 
    references_many :fans, 
        :class_name => 'User', 
        :stored_as => :array, 
        :inverse_of => :fan_of 

    references_many :fan_of, 
        :class_name => 'User', 
        :stored_as => :array, 
        :inverse_of => :fans 
end 

# let's say we have users: al, ed, sports_star, movie_star  
sports_star.fans << al 
movie_star.fans << al 
sports_star.fans << ed 
movie_star.fans << ed 

movie_star.fans # => al, ed 
al.fan_of  # => sports_star, movie_star 

Le problème est que vous essayez de faire une association relationnelle à l'aide des documents uniquement intégrés. Lorsque vous avez un Fan intégré à l'intérieur d'un User, vous pouvez uniquement accéder au Fan via son parent User. Vous ne pouvez pas faire quelque chose comme Fan.find(some_id) parce qu'il n'y a pas de collection de Fan enregistrements.

Eventuellement, MongoDB prendra en charge les collections virtuelles qui vous permettront de le faire. Pour l'instant, vous devez utiliser des associations de type relationnel. Si vous souhaitez utiliser des documents incorporés dans ce cas, vous devez créer des méthodes personnalisées laides et inefficaces pour rechercher dans les enregistrements parents. Avec MongoDB et Mongoid, j'ai trouvé que vous pouvez facilement basculer entre les associations intégrées et relationnelles. Les relations de type SQL et les relations imbriquées ont toutes deux leur place et peuvent être utilisées ensemble pour un grand effet.

+0

User.first.fans << User.last renvoie Mongo :: OperationFailure: requête invalide –

+1

Vous ne pouvez pas utiliser 'first' et' last' comme ça, et vous ne pouvez pas modifier les associations en place comme ça. Souvent, 'User.last' retournera la même chose que' User.first'! Vous devez faire 'u = User.all.entries.first; u2 = User.all.entries.last; u.fans << u2 ». Je viens de tester ce code et ça marche pour moi. – bowsersenior

+0

Et cela va me permettre de faire en sorte que les utilisateurs deviennent aussi fan d'eux-mêmes? –

Questions connexes