Co powiesz na stowarzyszenie autoreferencyjne:
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
Problem polega na tym, że próbujesz wykonać powiązanie relacyjne, używając tylko osadzonych dokumentów. Kiedy masz Fan
osadzone wewnątrz User
, możesz uzyskać dostęp tylko do Fan
przez jego rodzica User
. Nie możesz zrobić czegoś takiego jak Fan.find(some_id)
ponieważ nie ma kolekcji Fan
dokumentacja.
Docelowo MongoDB będzie obsługiwać wirtualne kolekcje, które pozwolą Ci to zrobić. Na razie musisz używać skojarzeń typu relacyjnego. Jeśli chcesz w tym przypadku użyć osadzonych dokumentów, musisz stworzyć brzydkie i nieefektywne niestandardowe metody przeszukiwania rekordów nadrzędnych.
Dzięki MongoDB i Mongoid odkryłem, że można łatwo przełączać się między skojarzeniami osadzonymi i relacyjnymi. Relacje typu SQL i relacje osadzone mają swoje miejsce i mogą być używane razem z doskonałym skutkiem.