2017-09-09 10 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 

でサブクエリとして使用するフォーム

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

でARELを使用してSQLを生成する必要があると私はcommentsテーブルを別名する方法を見つけ出すことはできませんサブクエリ

私が得ることができる最も近い

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 
関連する問題