Eifrige Lade Assoziation Zählung mit Arel (Rails 3)
-
25-09-2019 - |
Frage
Einfache Aufgabe: gegeben, dass ein Artikel viele Kommentare hat, die Lage sein, in einer langen Liste von Artikeln angezeigt werden, wie viele Kommentare jeder Artikel hat. Ich versuche, wie zu erarbeiten, diese Daten mit Arel vorab zu laden.
Die "Komplexe Aggregationen" der README Datei scheint diese Art von Situation zu diskutieren, aber es ist nicht genau das Beispielcode zur Verfügung stellen, auch nicht bietet eine Möglichkeit, es in zwei Abfragen zu tun statt einer Join-Abfrage, die schlechter für die Leistung ist.
In Anbetracht der folgenden:
class Article
has_many :comments
end
class Comment
belongs_to :article
end
Wie kann ich Vorspannung für einen Artikel Satz, wie viele Kommentare jeder hat?
Lösung
Sie können böse etwas tun mit SQL wie:
default_scope :select => 'articles.*, (select count(comments.id) from comments where comments.article_id = articles.id) as count_comments'
und dann würden Sie den Zugriff auf Article.first.count_comments haben.
Weitere (schöner) Methode, es zu tun ist, um die verwenden 'counter_cache' Feature / Option von belongs_to Assoziation.
Andere Tipps
Können Sie Zähler Cache nicht für diesen Einsatz?
belongs_to :article, :counter_cache => true
Sie müssen auch eine Migration haben, die die Spalte fügt comments_count