我有以下型号:
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
?
答案 0 :(得分:2)
我在mongoid
群组中提出了同样的问题并获得了answer。基本上,需要阅读三个宝石的文档来理解mongoid 3
(mongoid,轻便摩托车和原点)。
以下是origin
gem的相关文档section。 without
或only
子句可用于过滤生成的文档结构。
有选择地加载:
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