2012-02-06 5 views
2

J'ai deux modèles/tables A et B. Je voudrais effectuer une requête Active Record où les résultats incluent des colonnes des deux tables. J'ai essayé inner joins car ils sonnaient comme ils combinent des colonnes des deux tables. Cependant, en essayant la méthode de recherche Active Record joins renvoie les résultats de seulement la première table. Quelles requêtes d'enregistrement actif incluent des colonnes de deux tables dans les résultats?Général Active Record jointures ou inclut

Peut-être que la méthode de recherche includes pourrait vous aider.

Modifier: pensez aux deux tables ForumThreads et Posts. Chaque fil de discussion a plusieurs messages. Je voudrais que les lignes dans les résultats de la requête contiennent des informations pour chaque publication et des informations pour le fil de discussion du forum (par exemple, le titre du fil).

Cette question aurait pu répondre à ma question: Rails Joins and include columns from joins table

+2

Pouvez-vous être plus précis sur vous essayez de le faire? 'includes' chargera les données avec impatience. Mais 'ActiveRecord' vous cachera ces résultats et retournera simplement les objets parents dans un tableau. Les 'relations 'sont chargées mais vous ne les voyez pas dans les résultats. Expliquez comment vous essayez d'utiliser les données juste un peu. – Azolo

+0

@Azolo mis à jour la question avec plus d'informations. – SundayMonday

+1

@Gazler l'a obtenu, utilisez 'include' – Azolo

Répondre

9

Joins effectue une jointure interne, mais ne reviendra pas les données jusqu'à ce que vous demandez.

User.where(:id => 1).joins(:client_applications) 
User Load (0.2ms) SELECT "users".* FROM "users" INNER JOIN "client_applications" ON "client_applications"."user_id" = "users"."id" WHERE "users"."id" = 1 

Includes exécutera deux requêtes (à l'aide) et où en cache les données associées que (Désireuse Chargement)

User.where(:id => 1).includes(:client_applications) 
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 
    ClientApplication Load (13.6ms) SELECT "client_applications".* FROM "client_applications" WHERE "client_applications"."user_id" IN (1) 
+0

J'ai essayé d'utiliser' includes' mais les résultats de la requête ont toujours des colonnes provenant uniquement de la première table. S'il vous plaît poster un exemple de requête w/résultats des deux tables. – SundayMonday

+1

@MrMusic Vous devez toujours demander les ressources. Dans mon exemple ci-dessus, vous pourriez faire 'users = User.where (: id => 1) .includes (: client_applications)' Et puis quand vous voulez les applications client, vous pouvez faire 'users.first.client_applications' et il récupérez-les des résultats mis en cache de votre requête initiale. – Gazler