2017-09-09 5 views
0

나는Arel의 별칭이 지정된 테이블에서 select를 생성하려면 어떻게해야합니까?

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

내가있는 comments 테이블 별칭을하는 방법을 알아낼 수 없습니다

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

더 큰 쿼리에서 서브 쿼리로 사용되는 양식 Arel를 사용하여 SQL을 생성 할 필요가 서브 쿼리.

앨리어싱로 연결하지 않고

쿼리를 생성 내가 얻을 수있는 가장 가까운

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') 

하지만, (C2가 정의되어 있지 않기 때문에 오류)이 잘못된 SQL을

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

를 생성 하위 쿼리 내부 및 외부 테이블 이름이 충돌 할 때 잘못된 결과가 나타납니다.

이것은 Arel::TableAliasproject 방법 인 오류를 제공합니다.

s1 = c2.project(... 

Arel을 사용하여 별명이 지정된 테이블을 쿼리하려면 어떻게해야합니까?

당신은 어떤 테이블 (또는이 경우, 테이블 별칭에)에서 프로젝트에 알려 from을 사용할 수 있습니다

답변

1

:

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