ActiveRecord嵌套SELECT

时间:2016-05-22 17:33:15

标签: sql ruby-on-rails postgresql activerecord

我需要SELECT FROM嵌套SELECT的帮助。

如何以ActiveRecord方式重写以下查询并获取Relation对象?

SELECT candidates.*
FROM (SELECT (candidates.first_name || ' ' || candidates.last_name) AS full_name, candidates.* FROM candidates) candidates
WHERE full_name = 'Anton Kolganov'

2 个答案:

答案 0 :(得分:3)

为什么要连接而不是根据名字和姓氏进行选择?子选择的性能远低于直接查询。您可以使用select范围获取全名(它可以像其他属性一样访问):

 Candidate.select("candidates.*, (first_name || ' ' || last_name) AS full_name").
           where(first_name: 'Antonov', last_name: 'Kolganov')

更新:如果您确实需要使用FROM子句中的子选择重写上述查询到ActiveRecord,您可以执行以下操作:

Candidate.from("(SELECT (candidates.first_name || ' ' || candidates.last_name) AS full_name, candidates.* FROM candidates) candidates").
          where(full_name: 'Anton Kolganov')

即,通常,您可以将任何有效的SQL放入ActiveRecord范围方法中,包括selectfrom等。

答案 1 :(得分:1)

有多种方法。您必须通过将查询转换为sql或检查结果来尝试查看结果是否符合您的需求。

Candidates.where(other_query).where(SELECT (candidates.first_name || ' ' || candidates.last_name) AS full_name, candidates.* FROM candidates) candidates
WHERE full_name = 'Anton Kolganov')

你也可以使用连接或选择insterad的地方。

如果你不想使用普通的sql,你可以使用像Arel或  Squeel