2009-03-13 9 views
4

Supposons que le modèle X comporte un grand nombre d'Y et que le modèle Y soit associé à X. Chaque Y a une date à laquelle il a été inséré dans la base de données. Maintenant, est-il possible de charger tous les X et de charger impatiemment Y pour chacun des X (seulement le dernier parce que chaque X a des bazzilions de Ys)?Désireux de charger le dernier enregistrement subordonné

Répondre

4

Oui,

permet de prendre cet exemple

class Song < ActiveRecord::Base 
    has_many :votes 
end 

class Vote < ActiveRecord::Base 
    belongs_to :song 
end 

Ajouter une nouvelle association à la chanson:

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

cette nouvelle association retournera toujours le vote le plus récemment créé pour une chanson .

Pour charger impatient il:

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

Il serait intéressant de voir la jointure générée par cette requête. :) Il vaudra probablement mieux dénormaliser un peu et ajouter un champ à Song, last_vote_id, mis à jour chaque fois qu'un nouveau vote est ajouté. Just: include =>: last_vote par la suite, pas de chargement de données superflues (ou GROUP BY, si intelligent) nécessaire. – vladr

+0

Vrai, mon code ci-dessus est totalement non testé. Vlad, votre solution semble être une amélioration par rapport à la mienne. – Tilendor

+0

Cela permettra toujours de précharger tous les votes pour chaque chanson, et pas seulement le premier. Cela va générer une requête comme SELECT "votes". * FROM "votes" WHERE "votes". "Song_id" IN (1,2,3,4,5) ordre par created_at DESC –

0

La solution précédente est vraiment super! Cependant, je cherche une fonctionnalité plus: est-il possible de charger impatiemment le dernier enregistrement subordonné avant une date spécifique? Ceci est nécessaire pour que mes utilisateurs puissent parcourir l'historique des votes d'une chanson (avec des liens vers les jours précédents et suivants).

Questions connexes