如何检查MongoID是否存在关系?

时间:2012-03-17 09:55:29

标签: ruby-on-rails ruby optimization mongodb mongoid

假设我有'用户'和'收藏',以多对多的关系。

要向用户添加收藏,我可以这样做:

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

问题是,这不是我在Mongo中的方式。这是获取所有用户的收藏夹(可能是数千),只是为了检查其中一个是否存在。

有关如何优化该行代码以获得更高性能的任何想法?

3 个答案:

答案 0 :(得分:2)

您可以在此处使用mongoid的add_to_set方法。

user.add_to_set(:favorite_ids, my_new_favorite.id)

答案 1 :(得分:0)

我真的不认为检查是必要的--Mongoid会自动处理从关联中移除欺骗,所以只需按照通常的方式添加收藏夹。

答案 2 :(得分:0)

我最终创建了自己的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。