如何从Arel中的别名表生成选择?

时间:2017-09-09 13:26:18

标签: ruby-on-rails ruby activerecord arel

我需要使用Arel以

形式生成SQL
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表进行别名。

我能得到的最接近的是

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 个答案:

答案 0 :(得分:3)

您可以使用from告诉它从哪个表(或在本例中为表别名)进行投影:

myarray = (3,2,1)
sorttime = %timeit -n1 -r3 -o myarray.sort() 
print(sorttime.best)