2017-09-09 5 views
0

J'ai besoin de générer des requêtes SQL en utilisant Arel avec le formulaireComment puis-je générer une sélection à partir d'une table d'alias dans Arel?

SELECT c2.user_id, MAX(c2.created_at) as max_created_at 
FROM comments AS c2 
GROUP BY c2.user_id 

à utiliser comme sous-requête dans une requête plus

SELECT * 
FROM comments 
INNER JOIN (...subquery...) s1 
ON comments.user_id = s1.user_id 
AND comments.created_at = s1.max_created_at 

et je ne peux pas comprendre comment alias la table comments dans la sous-requête.

Le plus proche que je peux obtenir est

c2 = Comment.arel_table.alias 
s1 = Comment.arel_table.project(
    c2[:user_id], c2[:created_at].maximum.as('max_created_at') 
    ).group('user_id').as('s1') 

mais cela génère le SQL incorrect

SELECT c2.user_id, MAX(c2.created_at) as max_created_at 
FROM comments 
GROUP BY c2.user_id 

(erreurs parce que c2 n'est pas défini)

Génération de la requête sans aliasing conduit à résultats incorrects que les noms de table à l'intérieur et à l'extérieur de la sous-requête entrent en collision.

Ceci donne l'erreur que Arel::TableAlias a à la méthode project.

s1 = c2.project(... 

Comment puis-je interroger une table d'alias à l'aide d'Arel?

Répondre

1

Vous pouvez utiliser from pour lui dire quelle table (ou dans ce cas, alias de table) pour projeter de:

c2 = Comment.arel_table.alias 
s1 = Comment.arel_table. 
    project(c2[:user_id], c2[:created_at].maximum.as('max_created_at')). 
    from(c2).group('user_id').as('s1') 
puts s1.to_sql 
# (SELECT "comments_2"."user_id", MAX("comments_2"."created_at") AS max_created_at 
# FROM "comments" "comments_2" GROUP BY user_id) s1