如何防止has_many关系父母进行多次DB往返

时间:2013-03-10 07:50:36

标签: ruby mongodb mongoid errbit

我可能在这里遗漏了一些东西,但似乎这是一次性能疏忽。在查看Errbit的查询日志并注意到数百个查询相同对象时,我首先注意到了这一点。

似乎所有has_many关系的子项在通过关系加载后都没有引用回父对象。即访问parent.children.map &:parent将从每个child获取数据库中的父级,而不是使用parent

的内存副本进行设置

实施例

使用非常简单的belongs_to / has_many设置:

class Person
  include Mongoid::Document
  field :name
  has_many :posts, :inverse_of => :person
end

class Post
  include Mongoid::Document
  field :text
  belongs_to :person, :inverse_of => :posts
end

然后,在Rails控制台中,一个简单的演示:

Loading development environment (Rails 3.2.12)
[1] pry(main)> tom = Person.create(:name => 'Tom')
[2] pry(main)> tom.posts.create(:text => 'stuff')
[3] pry(main)> tom.posts.create(:text => 'other stuff')
[4] pry(main)> Person.first.posts.map {|post| post.person.object_id}
=> [50687740, 50719060]

请注意,最后一行,每个person引用指向不同的ruby对象。我使用ruby的object_id属性来突出显示这些是字面上不同的对象,这需要两次往返数据库。

在通过has_many关系加载后,为什么父关系只是对父对象的引用

1 个答案:

答案 0 :(得分:0)

原来这是一个已知的缺陷,并为版本4.0添加了此功能is planned

与此同时,您可以通过启用Mongoid Identity Map

来大幅减少重复查询并提高性能