ruby-on-rails ActiveRecord嵌套SELECT

mxg2im7a  于 2023-06-25  发布在  Ruby
关注(0)|答案(2)|浏览(165)

我需要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'
gzjq41n4

gzjq41n41#

为什么要连接而不是根据名字和姓氏进行选择?子选择的性能将远远低于直接查询。您可以使用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等。

axr492tv

axr492tv2#

有多种方法。您必须通过将查询转换为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')

你也可以用join或者select代替where。
如果你不想使用普通的sql,你可以使用像ArelSqueel这样的gem

相关问题