「画像」と呼ばれる MongoDB コレクションと、対応する「画像」モデルを持つ MongoMapper を利用したアプリケーションがあるとします。このモデルを使用して MongoMapper クエリを設定すると、それが type であり、 typePlucky::Queryの結果を返すことがわかりImageます。
>> Image.where(:file_type => 'image/jpeg').class
=> Plucky::Query
>> Image.where(:file_type => 'image/jpeg').first.class
=> Image
にアクセスすることで、ほとんどの場合 MongoMapper をバイパスして、対応するクエリを Mongo アダプターで直接実行できますMongoMapper.connection。このようにすると、クエリは typeであり、 typeMongo::Cursorの生データの結果を返しますBSON::OrderedHash。
>> MongoMapper.connection.db(dbname).collection('images').find({ :file_type => 'image/jpeg' }).class
=> Mongo::Cursor
>> MongoMapper.connection.db(dbname).collection('images').find({ :file_type => 'image/jpeg' }).first.class
=> BSON::OrderedHash
問題は、Plucky::Query上記のようなものを取得して、基本的な非拡張Mongo::Cursorオブジェクトに変換 (または取得) する方法はありますか?
find_each最初は、実際に を取り、Plucky::Queryを返すで解決策を見つけたと思いましたMongo::Cursor:
>> Image.where(:file_type => 'image/jpeg').find_each.class
=> Mongo::Cursor
しかし、オブジェクトの代わりにオブジェクトをMongo::Cursor返すため、これは何らかの形で拡張されているか、上記のものとは異なることがわかります。ImageBSON::OrderHash
>> Image.where(:file_type => 'image/jpeg').find_each.first.class
=> Image
更新: MongoMapper の機能 (具体的にはスコープという名前) にアクセスしてクエリを作成する必要があるため、2 番目のケースのように MongoMapper クエリ マジックを単純にバイパスすることはできませんPlucky::Query。しかし、必要なのはデータだけであり、モデルのインスタンス化のオーバーヘッドが必要ないため、結果をモデルではなくプレーンなデータ オブジェクトにしたいと考えています。