Ruby on rails 如何检查是否存在与MongoID的关系?

Ruby on rails 如何检查是否存在与MongoID的关系?,ruby-on-rails,ruby,optimization,mongodb,mongoid,Ruby On Rails,Ruby,Optimization,Mongodb,Mongoid,假设我有“用户”和“收藏夹”,在多对多关系中 要向用户添加收藏夹,我可以执行以下操作: user.favorites << my_new_favorite unless user.favorites.include?(my_new_favorite) user.favorites我真的认为根本没有必要进行检查-Mongoid将自动处理从关联中删除重复项的操作,因此只需像平常一样附加收藏夹即可。您可以在此处使用Mongoid的方法 user.add_to_set(:favorite_

假设我有“用户”和“收藏夹”,在多对多关系中

要向用户添加收藏夹,我可以执行以下操作:

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

user.favorites我真的认为根本没有必要进行检查-Mongoid将自动处理从关联中删除重复项的操作,因此只需像平常一样附加收藏夹即可。

您可以在此处使用Mongoid的方法

user.add_to_set(:favorite_ids, my_new_favorite.id)

我最终基于@rubish answer创建了自己的link()函数

将其添加到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。

实际上user.favorites只是一个常规数组。调用user.save!,MongoID将只检查favorite.users中是否没有重复项,但将向user.favorites添加一个新条目。不确定这是出于设计还是一个bug。所以我将不得不做2个add_to_set调用。我不敢相信mongoId没有考虑到这样的基本情况。不过,这应该可以解决性能问题,我可能会接受这个答案。这不是mongoid问题,它是文档存储如何工作的基础。Mongoid确实为您提供了一个habtm选项来处理这个问题。这就是Mongoid的基本功能。