我需要帮助从嵌套选择。
如何用ActiveRecord方式重写以下查询并获取一个Relation对象?
SELECT candidates.*
FROM (SELECT (candidates.first_name || ' ' || candidates.last_name) AS full_name, candidates.* FROM candidates) candidates
WHERE full_name = 'Anton Kolganov'
最佳答案
为什么要连接而不是基于名字和姓氏进行选择?与直接查询相比,子选择的性能要差得多。您可以使用select
作用域获取全名(它将以与其他属性相同的方式访问):
Candidate.select("candidates.*, (first_name || ' ' || last_name) AS full_name").
where(first_name: 'Antonov', last_name: 'Kolganov')
更新:如果确实需要用
FROM
子句中的subselect将上述查询重写为ActiveRecord,可以执行以下操作:Candidate.from("(SELECT (candidates.first_name || ' ' || candidates.last_name) AS full_name, candidates.* FROM candidates) candidates").
where(full_name: 'Anton Kolganov')
也就是说,一般来说,您可以将任何有效的SQL放入ActiveRecord作用域方法中,包括
select
、from
等。