2

私は次のモデルを持っています:

class Foo
 has_and_belongs_to_many :bars
end

class Bar
 has_and_belongs_to_many :foos
end

インスタンスを表す各ドキュメントには、Fooと呼ばれる配列フィールドがありますbar_ids。FooオブジェクトがDBから取得されるたびに、Mongoidはその内容bar_idsも取得します。ドキュメントに数千のIDがある場合、パフォーマンスの問題が発生する可能性があります。

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

ほとんどの場合、をロードする必要はありませんbar_ids。モデルに遅延読み込みを指示する方法はありbar_idsますか?

4

1 に答える 1

2

mongoid私はグループで同じ質問をし、答えを得ました。基本的に、理解するには3つの宝石mongoid 3(モンゴイド、モペット、起源)のドキュメントを読む必要があります。

これがgemの関連ドキュメントセクションです。or句を使用して、結果のドキュメント構造をフィルタリングできますoriginwithoutonly

選択的にロード:

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
于 2012-06-29T20:23:48.200 に答える