我需要帮助从嵌套选择。
如何用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作用域方法中,包括selectfrom等。

08-04 22:10