在使用mongoid gem时延迟加载has_and_belongs_to_many字段

时间:2012-06-29 08:31:30

标签: ruby-on-rails mongoid

我有以下型号:

class Foo
 has_and_belongs_to_many :bars
end

class Bar
 has_and_belongs_to_many :foos
end

表示Foo实例的每个文档都有一个名为bar_ids的数组字段。当从数据库中检索到Foo对象时,Mongoid也会检索bar_ids的内容。当文档有1000个ID时,这可能会导致性能问题,即

> Foo.first
#<Foo _id: 4fed60aa2bdf061c2c000001, bar_ids: [1, 2, 3.... 5000]>

在大多数情况下,我不需要加载bar_ids。有没有办法可以指示模型延迟加载bar_ids

1 个答案:

答案 0 :(得分:2)

我在mongoid群组中提出了同样的问题并获得了answer。基本上,需要阅读三个宝石的文档来理解mongoid 3(mongoid,轻便摩托车和原点)。

以下是origin gem的相关文档sectionwithoutonly子句可用于过滤生成的文档结构。

有选择地加载:

Foo.without(:bar_ids).first

有选择地重新加载:

def reload_fields(*fields)
  return self if fields.empty? or new_record?
  # unscope and prevent loading from indentity map
  fresh = Mongoid.unit_of_work(disable: :current) do
    self.class.unscoped.only(*fields).find(id)
  end
  fields.each do |attr| 
    write_attribute(attr, fresh.read_attribute(attr))
    remove_change(attr) # unset the dirty flag for the reloaded field
  end
  self
end