2017-09-09 20 views
0

我需要使用阿雷爾與如何從Arel中的別名表中生成選擇?

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

被用作一個大的查詢子查詢的形式

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

,我無法弄清楚如何別名comments表中生成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') 

但這產生不正確的SQL

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

(錯誤,因爲C2是沒有定義)

生成查詢,而不走樣導致表名內部和外部子查詢發生衝突時,結果不正確。

這給出了Arel::TableAliasproject方法錯誤。

s1 = c2.project(... 

如何使用Arel查詢別名表?

回答

1

您可以使用from告訴它哪個表(或在這種情況下,表的別名)從Project:

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