Wat dacht je van een zelfreferentiële associatie:
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
Het probleem is dat u relationele associatie probeert uit te voeren met alleen ingesloten documenten. Als je een Fan
hebt ingebed in een User
, je hebt alleen toegang tot de Fan
via zijn bovenliggende User
. Je kunt niet zoiets doen als Fan.find(some_id)
omdat er geen verzameling is van Fan
verslagen.
Uiteindelijk zal MongoDB virtuele collecties ondersteunen waarmee u dit kunt doen. Voor nu moet je associaties van het relationele type gebruiken. Als u in dit geval ingesloten documenten wilt gebruiken, moet u een aantal lelijke en inefficiënte aangepaste methoden maken om door bovenliggende records te zoeken.
Met MongoDB en Mongoid heb ik ontdekt dat je gemakkelijk kunt schakelen tussen embedded en relationele associaties. Relaties van het SQL-type en ingebedde relaties hebben beide hun plaats en kunnen met groot effect samen worden gebruikt.