我将以下内容作为AR查询的一部分:
.having('COUNT(foo.id) > bar.maxUsers')
这会产生错误:
ActiveRecord::StatementInvalid:
PG::UndefinedColumn: ERROR: column bar.maxusers does not exist
^
HINT: Perhaps you meant to reference the column "bar.maxUsers".
我正在引用bar.maxUsers
列。
因此,显然,AR简化了查询。如何抑制这种行为?
Rails 4.2.10
PostgreSQL
编辑:SQL:
SELECT ... HAVING COUNT(foo.id) > bar.maxUsers
所以它在to_sql
之后发生。也许来自execute
?
答案 0 :(得分:6)
这不是ActiveRecord或AREL问题,这只是区分大小写在SQL和PostgreSQL中的工作方式。
SQL中的标识符(例如表名和列名)不区分大小写,除非用引号引起来。标准SQL表示未加引号的标识符折叠成大写,而PostgreSQL则将它们折叠成小写,因此错误消息中的bar.maxusers
。
解决方案是引用有问题的列名:
.having('COUNT(foo.id) > bar."maxUsers"')
请注意,必须使用双引号将标识符引起来,因为单引号仅用于字符串文字。还要注意,标识符引用是特定于数据库的:标准SQL和PostgreSQL使用双引号,MySQL使用反引号,SQL Server使用方括号,...