2009-03-13 17 views
4

Angenommen, Modell X hat viele Ys und Modell Y gehört zu X. Jedes Y hat ein Datum, wenn es in die Datenbank eingefügt wurde. Nun, ist es möglich, alle Xs zu laden und eifrig letzte Y für jedes von X zu laden (nur das letzte, weil jedes X Bazzilionen von Ys hat)? JaEager loading letzten untergeordneten Datensatz

Antwort

4

,

Lets diesem Beispiel nehmen

class Song < ActiveRecord::Base 
    has_many :votes 
end 

class Vote < ActiveRecord::Base 
    belongs_to :song 
end 

eine neue Zuordnung zu dem Lied hinzufügen:

has_one :last_vote, :class_name => 'Vote', :order => 'created_at DESC' 

dieser neue Verein wird die zuletzt erstellte Abstimmung für ein Lied immer wieder zurückkehren .

Um eifrig Last es:

songs = Song.find(:all, :conditions => 'artist_name = "frank"', :include => :last_vote) 
+1

Es wäre interessant, den von dieser Abfrage erzeugten Join zu sehen. :) Es wird wahrscheinlich am besten sein, ein wenig zu denormalisieren und ein Feld zu Song hinzuzufügen, last_vote_id, das jedes Mal aktualisiert wird, wenn eine neue Stimme hinzugefügt wird. Just: include =>: last_vote danach, keine überflüssigen Datenladungen (oder GROUP BY, falls smart) benötigt. – vladr

+0

Richtig, mein vorstehender Code ist völlig ungetestet. Vlad, deine Lösung klingt wie eine Verbesserung gegenüber meiner. – Tilendor

+0

Dies wird immer noch alle Stimmen für jeden Song vorladen, nicht nur den ersten. Dies erzeugt Abfrage wie SELECT "Stimmen". * FROM "Stimmen" WHERE "Stimmen". "Song_ID" IN (1,2,3,4,5) Reihenfolge von erstellt_AT DESC –

0

Die bisherige Lösung ist wirklich toll! Ich suche jedoch nach einem weiteren Feature: Ist es möglich, den letzten untergeordneten Datensatz vor einem bestimmten Datum zu laden? Dies ist erforderlich, damit meine Benutzer die Voten eines Verlaufs und eines Songs durchsuchen können (mit Links zum vorherigen und nächsten Tag).

Verwandte Themen