How-to: у пользователя есть поклонники - PullRequest
6 голосов
/ 09 ноября 2010

Мне нужны пользователи, чтобы стать поклонниками других пользователей.Как мне спроектировать / настроить это?

Мне нужно, чтобы иметь возможность просматривать информацию о фанатах пользователей.

Например.У меня есть пользователь: Foo.У Фу 3 фаната.Я бы хотел найти имена поклонников Фу.Таким образом:

foo = User.first
foo.name (returns 'Foo')
foo.fans.first.user.name (should return 'bar', since 'bar' is a fan of 'foo')

Вот как я настроил его в данный момент:

User model:
  embeds_many :fans
  references_many :fans

Fan model:
  embedded_in :user, :inverse_of => :fans
  referenced_in :user

In console, I do:
  User.first.fans.create!(:user => User.first)

и я получаю: Mongoid :: Errors :: InvalidCollection: Доступ кколлекция для Fan не разрешена, поскольку это встроенный документ, обратитесь к коллекции из корневого документа. Я думаю, что проблема заключается в том, что модель вентилятора встроена в пользовательскую модель, которая имеет собственную ссылку напользовательская модель, а также ....

Ваши мысли будут высоко оценены.

1 Ответ

9 голосов
/ 22 ноября 2010

Как насчет самореферентной ассоциации:

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

Проблема в том, что вы пытаетесь установить реляционную ассоциацию, используя только встроенные документы.Если у вас есть Fan, встроенный в User, вы можете получить доступ к Fan только через его родительский User.Вы не можете сделать что-то вроде Fan.find(some_id), потому что нет коллекции Fan записей.

Со временем MongoDB будет поддерживать виртуальные коллекции, которые позволят вам это сделать.На данный момент вы должны использовать ассоциации реляционного типа.Если вы хотите использовать встроенные документы в этом случае, вам нужно создать некрасивые и неэффективные пользовательские методы для поиска по родительским записям.

С MongoDB и Mongoid я обнаружил, что вы можете переключаться между встроенными и реляционными ассоциациямибез труда.Отношения типа SQL и встроенные отношения имеют свое место и могут эффективно использоваться вместе.

...