Как реализовать «социальный» аспект с помощью mongoid - PullRequest
3 голосов
/ 11 сентября 2010

Я пытаюсь создать сеть друзей на создаваемом мной сайте.Я использую Mongoid.Как создать экземпляр друзей?

Я предполагаю, что пользователи должны иметь реляционную связь с несколькими другими пользователями.Но следующий код:

class User
  include Mongoid::Document
  references_many :users, :stored_as=>:array, :inverse_of=> :users
end

говорит мне, что у меня неверный запрос.Что я делаю неправильно?У кого-нибудь есть предложения, как получить то, что я ищу?

Ответы [ 2 ]

3 голосов
/ 15 сентября 2010

По-видимому, после долгих исследований Mongoid в настоящее время не способен к циклическим ассоциациям, хотя помечается как необходимое исправление и может быть исправлено в будущей версии. Текущий обходной путь, который я использую, выглядит следующим образом:

class User
  include Mongoid::Document
  field :friends, :type => Array, :default => []

  def make_friends(friend)
    self.add_friend(friend)
    friend.add_friend(self)
  end

  def friends
    ids = read_attribute :friends
    ids.map { |id|  User.find(id)}
  end

  def is_friends_with? other_user
    ids = read_attribute :friends
    ids.include? other_user.id
  end

protected

  def add_friend(friend)
    current = read_attribute :friends
    current<< friend.id
    write_attribute :friends,current
    save
  end
end
0 голосов
/ 03 марта 2016

Краткий ответ: вы не можете. MongoDB не имеет понятия объединяющей таблицы и не объединяет вообще. Монгоидная «симуляция« многие ко многим »выполняется путем хранения массивов внешних ключей на каждой стороне.

В ответ на комментарий: MongoDB - это хранилище документов. Поэтому он подходит для ситуаций, когда «документы» сильно разнородны. Поскольку вы храните своих рекламодателей в поддереве кампаний и рекламных объявлений, вам придется собирать рекламные объявления для рекламодателей в виде кода рубина. Если ваши данные имеют очень однородную форму, вы можете использовать реляционную базу данных. Мы часто использовали MySQL для связывания объектов, а затем добавляли документы MongoDB к объектам, чтобы они были расширяемыми.

...