3 Stimmen

Sortieren nach Anzahl der Assoziationsdatensätze in Datamapper

Sagen wir, ich habe die folgenden DataMapper-Ressourcen:

class Post
  include DataMapper::Resource 

  has n, :comments
  ...

end  

class Comment
  include DataMapper::Resource 

  belongs_to :post
  ...

end

Um die geordnete Liste der Beiträge zu erhalten, weiß ich, dass Sie tun können:

@posts = Posts.all(:order => :date.desc)

Aber nehmen wir an, ich möchte alle Beiträge absteigend nach der Anzahl der Kommentare sortiert anzeigen. Wie würde ich das machen?

2voto

Armin Punkte 21

Sie können alternativ sort_by verwenden, was eine separate Abfrage aufruft:

@post = Post.all(:order => :date.desc).sort_by { |post| -post.comments.count }

Wenn Sie die Reihenfolge ändern wollen, können Sie das Minuszeichen herausnehmen:

@post = Post.all(:order => :date.desc).sort_by { |post| post.comments.count }

Dies ist syntaktisch schön, aber wie adamaig weist darauf hin, es wird wahrscheinlich schlechter als die Zwischenspeicherung der Anzahl der Kommentare in der Datenbank durchführen, weil Sie eine zusätzliche SQL-Abfrage hinzufügen.

1voto

Bob Aman Punkte 32266

Ich glaube, dass die SQL, die Sie generieren wollen, lautet:

SELECT posts.*, COUNT(comments.id) AS comments_count FROM posts
JOIN comments ON posts.id = comments.post_id
GROUP BY posts.id ORDER BY comments_count DESC

Soweit ich weiß, ist dies nicht etwas, das Sie programmatisch mit der Klasse Query tun können. Drop in SQL für diese.

1voto

adamaig Punkte 262

Eine gute Möglichkeit, dies aus Leistungsgründen zu tun, ist die Zwischenspeicherung des Wertes comment_count für den Beitrag, was Ihnen dann ein Attribut für die :order geben würde, vielleicht wie :order => :comment_count_cache.desc . Dies lässt sich leicht einrichten, indem man einen Hook für das Kommentar-Modell nach der Erstellung hinzufügt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X