ActiveRecord列不存在

dsh*_*per 2 postgresql activerecord ruby-on-rails rails-postgresql

我有一个使用Postgres数据库的Rails应用程序,其中有一个名为geolite_blocks的表.如果我像这样调用ActiveRecord:

GeoliteBlock.find_by_startIpNum 2776360991
Run Code Online (Sandbox Code Playgroud)

查询完美无缺.但是,如果我这样做的查询:

GeoliteBlock.where("startIpNum >= ?", 2776360991)
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

ActiveRecord::StatementInvalid: PGError: ERROR:  column "startipnum" does not exist
LINE 1: ... "geolite_blocks".* FROM "geolite_blocks"  WHERE (startIpNum...
                                                             ^
: SELECT "geolite_blocks".* FROM "geolite_blocks"  WHERE (startIpNum >= 2776360991)
Run Code Online (Sandbox Code Playgroud)

但我知道该列存在,因为我只是用第一个代码示例查询它.关于为什么会发生这种情况的任何想法,以及我如何消除它?谢谢你的帮助!

mu *_*ort 6

SQL中的列名称不区分大小写,除非它们在创建时被引用.有人在你的startIpNum列周围创建了引号,因此每次使用它时都必须引用它:

GeoliteBlock.where('"startIpNum" >= ?', 2776360991)
Run Code Online (Sandbox Code Playgroud)

你从PostgreSQL中得到的错误提到,startipnum因为PostgreSQL将标识符规范化为小写(SQL标准说它们应该归一化为大写).

这个:

GeoliteBlock.find_by_startIpNum 2776360991
Run Code Online (Sandbox Code Playgroud)

因为AR会引用startIpNuM你背后的部分而起作用.同样,GeoliteBlock.where(:startIpNum => 2776360991)也会奏效.

我建议您更改架构以使用小写列名称,这样您就不必再担心这一点.