2010-11-25 4 views
1

J'ai un modèle de peinture. les votes sont intégrés dans la peinture. Comment puis-je interroger toutes les peintures et l'ordre par le nombre de votes? En théorie, je voudrais énumérer tous les tableaux commençant par ceux qui ont le plus de votes.Comment lister les peintures en fonction du nombre de votes

À titre de référence. Voici la définition des deux modèles:

class Painting 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :title, :type => String 

    embeds_many :votes 
    ... 
end 

class Vote 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    embedded_in :painting, :inverse_of => :votes 
    ... 
end 

Répondre

1

Vous pouvez le faire en utilisant contre colonne de cache. Une fois que vous implémentez cette fonctionnalité comme mentionné ici: http://railscasts.com/episodes/23-counter-cache-column, tableau peintures contiendra la colonne votes_count qui détient le nombre de votes pour chaque peinture

Ensuite, vous pouvez facilement ajouter named_scope dans votre modèle painting.rb pour commander des peintures par nombre de votes:

 

class Painting 
    named_scope :order_by_maximum_votes, :order => "votes_count DESC" 
end 
 

Ensuite, vous pouvez chercher toutes les peintures comme de cette façon:

@paintings = Painting.all.order_by_maximum_votes

+1

Comment cela est-il accepté si mongoid n'a pas de mécanisme de cache de compteur? –

0

Si vous ne voulez toujours pas à utiliser ajouter une colonne base de données, vous pouvez avoir une autre option simple. Récupérer toutes les peintures de la base de données et les trier par nombre de votes:


# It fetches all paintings needed 
@paintings = Painting.all 
# Then sort them by number of votes 
@paintings = @paintings.sort {|p| p.votes.length} 
+0

J'obtiens NoMethodError: méthode non définie 'sort 'pour main: Object. Une autre solution que j'ai trouvée (et que vous avez suggérée) consistait à ajouter une colonne supplémentaire pour garder une trace du nombre total de votes. –

+0

Oui, je suppose que le tri peut fonctionner uniquement sur un tableau. Nous devons donc nous assurer que @paintings contient un tableau. Ensuite, il ne devrait pas jeter une erreur. En passant, l'utilisation de la colonne counter cache est aussi un bon moyen :-) –

Questions connexes