2009-01-27 6 views
3

En ce moment, j'essaie d'appeler mon modèle et de cracher ses résultats au format json/xml. Mon seul problème est, mes associations de base de données ne sont pas chargées ou interrogées.Précharger des associations de modèles sur Rechercher

Normalement, je peux exécuter ce

@campaign = Campaign.find(:all)

ensuite obtenir le nombre de hits en appelant, @campaign[0].hits par le has_many :hits. Mais si vous déboguez la sortie, elle n'appelle que les colonnes de la table. Comment l'auriez-vous mis à côté de votre requête?

Dans l'exemple:

 
    <campaign> 
    <category>website</category> 
    <created-at type="timestamp">2009-01-24 14:49:02 -0800</created-at> 
    <end-at type="date">2009-01-24</end-at> 
    <id type="integer">14</id> 
    <is-watched type="integer">1</is-watched> 
    <name>Lets</name> 
    <slug>c5334415da5c89384e42ce6d72609dda</slug> 
    <start-at type="date">2009-01-24</start-at> 
    <user-id type="integer">5</user-id> 
    </campaign> 

Puis l'avoir ajouter à la place une autre colonne, mais il witht nombre de hits.

 
    <campaign> 
    <category>website</category> 
    <created-at type="timestamp">2009-01-24 14:49:02 -0800</created-at> 
    <end-at type="date">2009-01-24</end-at> 
    <id type="integer">14</id> 
    <is-watched type="integer">1</is-watched> 
    <name>Lets</name> 
    <slug>c5334415da5c89384e42ce6d72609dda</slug> 
    <start-at type="date">2009-01-24</start-at> 
    <user-id type="integer">5</user-id> 
    <hits type="integer">123412</hits> 
    </campaign> 

Répondre

7

ActiveRecord trouver() la famille prend une: option include qui vous permet de charger votre envie de associatons.

Donc, tout ce que vous devez faire est:

@campaign = Campaign.find (: tous, : include =>: hits)

ci-dessus chargerez vos appels désireux de bases de données de sorte que l'accès à chaque index [0]. [1], etc. ne lancent pas leurs propres appels SELECT. Lorsque vous appelez

@campaign [0] .to_json

Ensuite, il ne comprendra pas les associations, telles que les « coups » pour le faire, alors vous devez également: inclure dans l'appel to_json , par exemple

@campaign [0] .to_json (: include =>: hits)

+0

qui fait ce que j'ai demandé, mais est-il possible de ne pas renvoyer les lignes, mais de les compter juste, et retourner l'entier? – Garrett

+0

Oui. ActiveRecord renvoie une associationProxy (qui agit comme un tableau mais a plus de super-pouvoirs). Une méthode qu'il a est "taille()". Donc, vous pouvez faire @campaign = Campaign.find (: all,: include =>: hits) @ campaign.each faire | cpg | met "Hits: # {cpg.hits.size}" fin –

+0

AssocationProxy a "nombre", "taille" et "longueur", couverts ici: http://rhnh.net/2007/09/26/ counting-activerecord-associations-count-taille-ou-longueur –

1

Vous pourriez être en mesure de réaliser ce que vous voulez ici en ajoutant un champ hits_count à votre modèle de campagne. Cela sera automatiquement mis à jour lorsque de nouvelles associations sont ajoutées.

Jetez un oeil à counter_cache dans la documentation ActiveRecord Associations

Questions connexes