Als Kevin vorgeschlagen hat, ist counter_cache die einfachste Option, was auf jeden Fall würde ich verwenden.
class Author < ActiveRecord::Base
has_many :books, :counter_cache => true
end
class Book < ActiveRecord::Base
belongs_to :author
end
Und wenn Sie mit Rails 2.3 und Sie würden dies der Standard sein, wie die Bestellung Sie die neue default_scope Methode verwenden:
class Author < ActiveRecord::Base
has_many :books, :counter_cache => true
default_scope :order => "books_count DESC"
end
books_count ist das Feld, das den Zähler Caching-Verhalten führt, und es gibt wahrscheinlich einen besseren Weg, als es direkt im Standardumfang zu verwenden, aber es gibt Ihnen die Idee und wird die Arbeit erledigen.
EDIT:
Als Reaktion auf den Kommentar zu fragen, ob counter_cache funktionieren wird, wenn eine nicht Rails-Anwendung, die Daten verändert, und es kann, aber nicht in der Art und Weise standardmäßig als Rails-Schritte und dekrementiert den Zähler zu sparen Zeit. Sie können Ihre eigene Implementierung in einen after_save Callback schreiben.
class Author < ActiveRecord::Base
has_many :books
after_save :update_counter_cache
private
def update_counter_cache
update_attribute(:books_count, self.books.length) unless self.books.length == self.books_count
end
end
Jetzt haben Sie nicht ein counter_cache installiert, aber wenn Sie das Feld in der Datenbank books_count Namen gemäß der counter_cache Konvention dann, wenn man nach oben schaut:
@Author = Author.find(1)
puts @author.books.size
Es wird nach wie vor der Verwendung Zähler im Cache speichern, anstatt eine Datenbanksuche durchzuführen. Natürlich funktioniert das nur, wenn die App "rails" die Tabelle aktualisiert. Wenn also eine andere App etwas tut, sind Ihre Nummern möglicherweise nicht mehr synchron, bis die Rails-Anwendung zurückkehrt und gespeichert werden muss. Der einzige Weg, den ich mir vorstellen kann, ist ein Cron-Job, um Zahlen zu synchronisieren, wenn Ihre Rails-App die Dinge nicht oft genug nachschlägt, um es unwichtig zu machen.
funktioniert Counter-Caching, wenn eine Nicht-Rails-Anwendung die Daten in der Datenbank direkt aktualisiert (d. H. Ein Buch entfernt)? – dplante
Ich vermute nicht, zumindest bis du den Datensatz wieder von der te Rails App speicherst. –