Какво ще кажете за самореферентна асоциация:
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
Проблемът е, че се опитвате да направите релационна асоциация, като използвате само вградени документи. Когато имате Fan
вградени в User
, имате достъп само до Fan
чрез своя родител User
. Не можете да направите нещо като Fan.find(some_id)
защото няма колекция от Fan
записи.
В крайна сметка MongoDB ще поддържа виртуални колекции, които ще ви позволят да направите това. Засега трябва да използвате асоциации от релационен тип. Ако искате да използвате вградени документи в този случай, трябва да създадете някои грозни и неефективни персонализирани методи за търсене в родителските записи.
С MongoDB и Mongoid открих, че можете лесно да превключвате между вградени и релационни асоциации. Връзките от типа SQL и вградените релации имат своето място и могат да се използват заедно с голям ефект.