2012-06-23 8 views
0
User 
    first_name: "Johnny" 
    age: 15 

Car 
    name: "Mazda" 

Car 
    name: "BMW" 

Je voudrais que les résultats ressemblent àActive Complex Enregistrez Association

[ {"first_name": "Johnny", "age": 15, cars: [ { "name": "Mazda" }, { "name" : "BMW" } ] } ] 

Est-il possible de le faire dans Rails? Jusqu'à présent, je peux obtenir la voiture des utilisateurs en tapant johnny.cars mais j'aimerais que la structure de données contienne également les valeurs du parent. J'étais en train de jouer avec l'idée d'utiliser named_scopes et les attributs transitoires, mais jusqu'à présent aucune idée/aide n'est grandement appréciée.

+0

ce que votre modèle assoications entre la voiture et l'utilisateur 'has_many' ou' has_many: through' alors nous pouvons aussi aider à chercher à retourner la sortie json du serveur alors je suppose que ce lien peut aider 'http://apidock.com/ rails/ActiveRecord/Serialization/to_json' – Viren

+0

J'utilise beaucoup-à-plusieurs (j'en ai beaucoup à faire) mais j'aimerais boucler tous les utilisateurs tout en affichant toutes leurs voitures. – lemon

+0

alors qu'est-ce qui vous arrêtait alors n'essayais pas: includes =>: les voitures quand vont tous les utilisateurs quelque chose comme ceci 'User.includes (: cars)' – Viren

Répondre

2

Vous pouvez réellement récupérer tous les enregistrements de l'autre table à l'aide :includes déclaration

includes est la syntaxe magique où vous pouvez en charge désireux tous les enregistrements assocaited d'un enregistrement.

Exemple Dans votre cas

voitures has_many utilisateur

donc si vous ne

@users = User.includes(:cars)

Maintenant, ce chargerait tous les enregistrements d'utilisateur et vous eagerload tous les records de voitures pour chaque utilisateur objets

donc si vous bouclez à travers un objet utilisateur et faire

<% @users.each do |user| %> 
    <%= user.cars %> 
<%end%> 

user.cars wont feu une séparée requête pour récupérer les toutes les voitures pour les utilisateurs à la place, il va chercher les dossier désireux chargé à l'aide de la clause includes

Cette technique est largement utilisée pour éviter N+1 problème de requête

Google pour N+1 pour en savoir plus sur elle

Hope this Aide