Que diriez-vous d'une association auto-référentielle :
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 en utilisant uniquement des documents intégrés. Lorsque vous avez un Fan
intégré dans un User
, vous ne pouvez accéder qu'au Fan
via son parent User
. Vous ne pouvez pas faire quelque chose comme Fan.find(some_id)
car il n'y a pas de collection de Fan
enregistrements.
A terme, 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 intégré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 constaté que vous pouvez basculer facilement entre les associations intégrées et relationnelles. Les relations de type SQL et les relations intégrées ont toutes deux leur place et peuvent être utilisées ensemble avec beaucoup d'effet.