Как проверить, существует ли связь с MongoID? - PullRequest
0 голосов
/ 17 марта 2012

Допустим, у меня есть «пользователи» и «фавориты» в отношениях «многие ко многим».

Чтобы добавить фаворита для пользователя, я мог бы сделать что-то вроде этого:

user.favorites << my_new_favorite unless user.favorites.include?(my_new_favorite)

Проблема в том, что это не так, как я бы сделал в Монго.Он выбирает все избранное пользователя (может быть тысячи), только чтобы проверить, существует ли один из них.

Есть идеи, как оптимизировать эту строку кода, чтобы она была более производительной?

Ответы [ 3 ]

2 голосов
/ 17 марта 2012

Вы можете использовать метод mongoid add_to_set здесь.

user.add_to_set(:favorite_ids, my_new_favorite.id)
0 голосов
/ 17 марта 2012

Я закончил тем, что создал свою собственную функцию link (), основанную на ответе @rubish.

Добавьте это в initializers / mongoid.rb:

module Mongoid
  module Document
    def link(entity)
      add_to_set((entity.class.name.demodulize.downcase!.to_s + '_ids').to_sym, entity.id)
      save!() unless persisted?
      entity.add_to_set((self.class.name.demodulize.downcase!.to_s + '_ids').to_sym, id)
    end
  end
end

А затем просто свяжите () ваши много-много-много связанных сущностей, например:

my_new_favorite = Favorite.find_or_initialize_by(:field => 'value')
user.link(my_new_favorite)

Улучшения приветствуются, я начал использовать ruby ​​в прошлом месяце.

0 голосов
/ 17 марта 2012

Я не думаю, что проверка вообще необходима - Mongoid автоматически обработает удаление дубликатов из ассоциаций, поэтому просто добавьте избранное, как обычно.

...