2010-11-25 15 views
1

Ich habe ein Gemälde Modell. Stimmen sind in die Malerei eingebettet. Wie kann ich alle Bilder abfragen und nach der Anzahl der Stimmen sortieren? Theoretisch möchte ich alle Bilder, die mit denen mit den meisten Stimmen beginnen, auflisten.Wie man Bilder basierend auf der Anzahl der Stimmen auflistet

Zu Referenzzwecken. Hier ist die Definition der beiden Modelle:

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 

Antwort

1

Sie können es tun, indem Sie Zähler Cache Spalte. Sobald Sie diese Funktionalität wie hier erwähnt implementieren: http://railscasts.com/episodes/23-counter-cache-column, Gemälde Tabelle enthält votes_count Spalte enthält die Anzahl der Stimmen für jedes Gemälde

Dann können Sie einfach named_scope in Ihrem painting.rb-Modell, um Gemälde nach Anzahl der Stimmen bestellen:

 

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

Dann können Sie alle Bilder wie auf diese Weise holen:

@paintings = Painting.all.order_by_maximum_votes

+1

Wie wird dies akzeptiert, wenn Mongoid keinen Counter-Cache-Mechanismus hat ?? –

0

Wenn Sie immer noch nicht wollen, eine weitere Spalte hinzufügen, verwenden in Datenbank, können Sie eine andere einfache Option haben. Holen Sie alle Bilder aus der Datenbank und sortieren Sie sie dann nach Stimmenanzahl:


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

Ich bekomme NoMethodError: undefinierte Methode 'sort 'für main: Object. Eine andere Lösung, die ich gefunden habe (und wie Sie vorgeschlagen haben) war, eine zusätzliche Spalte hinzuzufügen, um die Gesamtzahl der Stimmen zu überwachen. –

+0

Ja, ich denke, dass sort nur mit dem Array arbeiten kann. Wir sollten also sicherstellen, dass @paintings ein Array enthält. Dann sollte es keinen Fehler werfen. Die Counter-Cache-Spalte ist übrigens auch ein guter Weg :-) –

Verwandte Themen