假设我有'用户'和'收藏',以多对多的关系。
要向用户添加收藏,我可以这样做:
user.favorites << my_new_favorite unless user.favorites.include?(my_new_favorite)
问题是,这不是我在Mongo中的方式。这是获取所有用户的收藏夹(可能是数千),只是为了检查其中一个是否存在。
有关如何优化该行代码以获得更高性能的任何想法?
答案 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。