モデルの属性のいずれかによって、多数のコレクションのいずれかでモデルを検索できるようにするグローバル検索を作成するというアイデアをいじっています。例えば:
次のコレクションがあります。
- ユーザー
- アプリケーション
- 役割
各ユーザー、アプリケーション、およびロールがどのような属性を持つかは事前にわかりませんが、説明のために次のようにします。
- ユーザー名
- User.last_name
- ユーザー.email
- アプリケーション.タイトル
- アプリケーションの説明
- Role.name
- Role.説明
Site
ここで、というメソッドで呼び出されるモデルを作成するとしsearch
ます。いずれかの属性に一致するSite.search(term)
各コレクション内のすべてのアイテムを検索したいと考えています。term
本質的には、グローバル モデル検索です。
これにどのようにアプローチすることをお勧めしますか? すべてのコレクションのモデルと各モデルの属性を繰り返し処理することで力ずくで実行できますが、それは肥大化して非効率的です。
助言がありますか?
/// 数分後...
これが私が今試したコードの一部です:
find: function(query) {
var results = {}; // variable to hold the results
// iterate over the collections
_.each(["users", "applications", "roles"], _.bind(function(collection){
// I want the result to be grouped by type of model so I add arrays to the results object
if ( !_.isUndefined(results[collection]) || !_.isArray(results[collection]) ) {
results[collection] = [];
}
// iterate over the collection's models
_.each(this.get(collection).models, function(model){
// iterate over each model's attributes
_.each(model.attributes, function(value){
// for now I'm only considering string searches
if (_.isString(value)) {
// see if `query` is in the attribute's string/value
if (value.indexOf(query) > -1) {
// if so, push it into the result's collection arrray
results[collection].push(model);
}
};
});
});
// a little cleanup
results[collection] = _.compact(results[collection]);
// remove empty arrays
if (results[collection].length < 1) {
delete results[collection];
}
},this));
// return the results
return results;
}
これで期待どおりの結果が得られ、問題なく動作すると思いますが、3 つの配列を反復処理していることに気付きます。別の解決策はないかもしれませんが、私はあると感じています。誰かが提案できる場合は、ありがとうございます!その間、私は研究を続けます。
ありがとうございました!