Co takhle sebereferenční sdružení:
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
Problém je v tom, že se pokoušíte provést relační asociaci pouze pomocí vložených dokumentů. Když máte Fan
vložené do User
, máte přístup pouze k Fan
prostřednictvím nadřazeného User
. Nemůžete udělat něco jako Fan.find(some_id)
protože neexistuje žádná sbírka Fan
evidence.
MongoDB nakonec bude podporovat virtuální sbírky, které vám to umožní. Prozatím musíte používat přidružení relačního typu. Pokud chcete v tomto případě použít vložené dokumenty, musíte vytvořit nějaké ošklivé a neefektivní vlastní metody pro vyhledávání v nadřazených záznamech.
S MongoDB a Mongoid jsem zjistil, že můžete snadno přepínat mezi vloženými a relačními asociacemi. Vztahy typu SQL a vložené vztahy mají své místo a lze je použít společně s velkým efektem.