如何使用带有大写列名的Rails?

时间:2018-08-23 21:40:02

标签: ruby-on-rails postgresql rails-activerecord ruby-on-rails-4.2

我将以下内容作为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

1 个答案:

答案 0 :(得分:6)

这不是ActiveRecord或AREL问题,这只是区分大小写在SQL和PostgreSQL中的工作方式。

SQL中的标识符(例如表名和列名)不区分大小写,除非用引号引起来。标准SQL表示未加引号的标识符折叠成大写,而PostgreSQL则将它们折叠成小写,因此错误消息中的bar.maxusers

解决方案是引用有问题的列名:

.having('COUNT(foo.id) > bar."maxUsers"')

请注意,必须使用双引号将标识符引起来,因为单引号仅用于字符串文字。还要注意,标识符引用是特定于数据库的:标准SQL和PostgreSQL使用双引号,MySQL使用反引号,SQL Server使用方括号,...