MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como fazer:o usuário tem fãs


Que tal uma associação 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

O problema é que você está tentando fazer associação relacional usando apenas documentos incorporados. Quando você tem um Fan incorporado dentro de um User , você só pode acessar o Fan por meio de seu pai User . Você não pode fazer algo como Fan.find(some_id) porque não há coleção de Fan registros.

Eventualmente, o MongoDB oferecerá suporte a coleções virtuais que permitirão que você faça isso. Por enquanto, você precisa usar associações do tipo relacional. Se você quiser usar documentos incorporados nesse caso, precisará criar alguns métodos personalizados feios e ineficientes para pesquisar os registros pai.

Com MongoDB e Mongoid, descobri que você pode alternar facilmente entre associações incorporadas e relacionais. Os relacionamentos do tipo SQL e os relacionamentos incorporados têm seu lugar e podem ser usados ​​juntos com grande efeito.