only()
パフォーマンス上の理由から、ロードするフィールドを指定するために、mongoidクエリを作成するときにキーワードをできるだけ頻繁に使用します。
通常の容疑者は、たとえば、表示目的でのみすべての管理者のユーザーの電子メールが必要な場合です。
私は書くだろう:
User.where(:groups => :admins).only(:email).each do |u|
puts u.email
end
これを行うのは、ユーザーモデルが大量の電子メールを一覧表示するときに喜んで無視できる大量のデータでいっぱいだからです。
ただし、ここで、ユーザーがプロジェクトモデルを介して参照されていると想像してみてください。これにより、プロジェクトごとに次のことができるようになりますproject.user
。mongoidの遅延読み込みのおかげで、オブジェクトユーザーは、参照を呼び出したときにのみインスタンス化されます(そしてDBから照会されます)。
しかし、たとえば、すべての管理プロジェクトの所有者のすべての電子メールを一覧表示したい場合はどうなりますか?
私はこれを書きます:
Project.where(:admin_type => true).each do |p|
puts p.user.email
end
ここでの主な問題は、これを行うと、各プロジェクトのユーザーオブジェクト全体が読み込まれ、クエリに一致するプロジェクトが多数ある場合はかなり重くなる可能性があることです。では、どうすればメールだけをロードできますか?
私はこれを行うことができます:
User.where(:_id => p.user_id).only(:email).first.email
しかし、これは明らかに、単純に実行するという優れた構文の目的を無効にします。
p.user.email
次のようなものが書けたらいいのにと思いますp.user.only(:email).email
が、できません。何か案は ?
アレックス