¿Qué tal una asociación autorreferencial:
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
El problema es que está tratando de hacer una asociación relacional utilizando solo documentos incrustados. Cuando tienes un Fan
incrustado dentro de un User
, solo puedes acceder al Fan
a través de su padre User
. No puedes hacer algo como Fan.find(some_id)
porque no hay colección de Fan
registros.
Eventualmente, MongoDB admitirá colecciones virtuales que le permitirán hacer esto. Por ahora, debe usar asociaciones de tipo relacional. Si desea utilizar documentos incrustados en este caso, debe crear algunos métodos personalizados desagradables e ineficientes para buscar en los registros principales.
Con MongoDB y Mongoid, descubrí que puede cambiar fácilmente entre asociaciones integradas y relacionales. Las relaciones de tipo SQL y las relaciones incrustadas tienen su lugar y se pueden usar juntas con gran efecto.