如何加入使用AREL子查询?(How to join on subqueries using ARe

2019-08-19 06:52发布

我有涉及我的Rails应用程序在不同机型加入了几个大规模的SQL请求。 单个请求可涉及为6〜10的表。

要运行我想使用子查询的连接(这样我可以过滤这些表之前的加入,降低了列我需要的)请求更快。 我试图做到这一点使用AREL。

我以为我找到了解决我的问题有: 如何做Rails内部在AREL子查询连接 ,但事情必须改变,因为我得到undefined method '[]' for Arel::SelectManager

没有任何人有任何想法如何做到这一点(不使用字符串)?

Answer 1:

皮埃尔,我想到了一个更好的解决方案可能是由以下(从灵感这个要点 ):

a = A.arel_table  
b = B.arel_table

subquery = b.project(b[:a_id].as('A_id')).where{c > 4}  
subquery = subquery.as('intm_table')  
query = A.join(subquery).on(subquery[:A_id].eq(a[:id]))

命名别名为“intm_table”没有特别的原因,我认为这将是减少混乱。



Answer 2:

这样就OK了我的主要问题是,你不能加入阿雷尔:: SelectManager ...但是你可以加入一个表别名。 因此,要产生上述我的评论请求:

a = A.arel_table
b = B.arel_table

subquery = B.select(:a_id).where{c > 4}
query = A.join(subquery.as('B')).on(b[:a_id].eq(a[:id])
query.to_sql # SELECT A.* INNER JOIN (SELECT B.a_id FROM B WHERE B.c > 4) B ON A.id = B.a_id 


文章来源: How to join on subqueries using ARel?