2012-03-17 50 views
0

假设我有'用户'和'收藏夹',采用多对多的关系。如何检查MongoID是否存在关系?

要一个最爱给用户,我可以做这样的事情:

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

的问题是,这是不是我会怎么做,在蒙戈。这是获取所有用户的最爱(可能是成千上万),只是为了检查是否存在其中一个。

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

回答

0

我最终创建了我自己的链接()函数,基于@rubish的答案。

一下添加到初始化/ 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) 

改进是值得欢迎的,我开始上个月使用红宝石。

+1

这就是mongoid的has_and_belongs_to_many函数的工作原理。 http://mongoid.org/en/mongoid/docs/relations.html#has_and_belongs_to_many – 2012-08-23 03:44:37

0

我真的不觉得这个检查是必要的 - Mongoid会自动处理从关联中删除模式,所以只需像往常一样追加最喜欢的模式。

+0

其实user.favorites只是一个常规数组。当调用user.save!时,MongoID将只检查favorite.users中是否有重复项,但会向user.favorites添加一个新项。不知道这是设计还是错误。 – HappyDeveloper 2012-03-17 12:49:37

2

您可以在这里使用mongoid的add_to_set方法。

user.add_to_set(:favorite_ids, my_new_favorite.id) 
+0

所以我将不得不做2个add_to_set调用。我不敢相信蒙戈德不会考虑这种基本情况。这应该解决性能问题,但我可能会接受这个答案。 – HappyDeveloper 2012-03-17 13:10:05

+0

它不会出现mongoid问题 - 它是文档存储如何工作的基础。 Mongoid确实提供了一个habtm选项来处理这个问题。 – 2012-08-23 03:45:23