2011-08-22 5 views
0

J'ai besoin de récupérer un ensemble de réponses selon 2 attributs.Mongoid Query Syntaxe Question

C'est ce que je veux faire:

# where liker_ids is an array and user_id is a bson in the answer document 
feed_answers=Answer.any_in(:liker_ids=>to_use,:user_id.in=>to_use).desc()map{|a|a} 

Ce que je fini par faire:

# to use 
to_use=[some array of ids] 
friend_answers=Answer.any_in(:liker_ids=>to_use).map{|a|a} 
liked_answers=Answer.where(:user_id.in=>to_use).map{|a|a} 

feed_answers=(friend_answers+ liked_answers).sort{|x,y| y.created_at<=>x.created_at} 

Le problème est que je ne sais pas comment combiner les 2 requêtes en une seule. J'ai essayé différentes combinaisons, mais rien ne semble fonctionner. et ma méthode de piratage est très inefficace bien sûr.

Répondre

1

vous devez faire (paramètre manquant à desc):

Answer.any_in(:liker_ids=>to_use, :user_id.in=>to_use).desc(:created_at) 

Mais le any_in ici est pas correctement utilisé, il se comporte comme where dans cette situation. Vous voulez probablement or:

Answer.or(:liker_ids=>to_use).or(:user_id.in=>to_use).desc(:created_at) 
# or 
Answer.any_of({:liker_ids=>to_use}, {:user_id.in=>to_use}).desc(:created_at) 
# or 
Answer.or({:liker_ids=>to_use}, {:user_id.in=>to_use}).desc(:created_at) 

Vous n'avez pas besoin que map à la fin de la chaîne de critères, critères MongoId sont chargés paresseux, quand ils rencontrent une méthode quels critères ne répondent pas à. Ils peuvent également exploiter les curseurs mongodb, il est donc conseillé de ne pas utiliser map si ce n'est pas nécessaire. Vous devez utiliser Criteia#only ou Criteria#without si vous souhaitez récupérer un sous-ensemble de champs de mongodb.

+0

Answer.or jette une erreur (méthode non définie 'ou 'pour la réponse: Class) –

+0

celui-ci a fini par fonctionner, merci! feed_answers = Answer.any_of ({: liker_ids.in => à_user}, {: user_id.in => à_use}). Desc (: created_at) .skip (à_skip) .limit (per_page) –

+0

@ming yellow Si vous Si vous voulez le ou pour travailler, vous devrez changer 'Answer.or' en' Answer.all.or'. Je ne sais pas pourquoi, mais ou n'a pas été exposé directement pour le modèle, fonctionne bien si vous avez déjà un critère si. – rubish