Wie wäre es mit einer selbstreferenziellen Assoziation:
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
Das Problem besteht darin, dass Sie versuchen, eine relationale Zuordnung nur mit eingebetteten Dokumenten vorzunehmen. Wenn Sie einen Fan
haben eingebettet in einen User
, können Sie nur auf den Fan
zugreifen durch seinen übergeordneten User
. Sie können so etwas wie Fan.find(some_id)
nicht tun weil es keine Sammlung von Fan
gibt Aufzeichnungen.
Letztendlich wird MongoDB virtuelle Sammlungen unterstützen, die Ihnen dies ermöglichen. Im Moment müssen Sie relationale Assoziationen verwenden. Wenn Sie in diesem Fall eingebettete Dokumente verwenden möchten, müssen Sie einige hässliche und ineffiziente benutzerdefinierte Methoden erstellen, um übergeordnete Datensätze zu durchsuchen.
Bei MongoDB und Mongoid habe ich festgestellt, dass Sie problemlos zwischen eingebetteten und relationalen Assoziationen wechseln können. SQL-artige Beziehungen und eingebettete Beziehungen haben beide ihren Platz und können mit großer Wirkung zusammen verwendet werden.