2012-03-19 147 views
2

我有一个Rails应用程序使用Postgres数据库和一个名为geolite_blocks的表。如果我这样称呼ActiveRecord:ActiveRecord列不存在

GeoliteBlock.find_by_startIpNum 2776360991 

查询完美地工作。但是,如果我不喜欢这样的查询:

GeoliteBlock.where("startIpNum >= ?", 2776360991) 

我得到这个错误:

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) 

但我知道,列存在,因为我只是通过它与第一个代码示例查询。任何想法为什么这可能会发生,以及我如何消除它?谢谢你的帮助!

回答

4

SQL中的列名不区分大小写,除非它们在创建时引用。有人与它周围的报价创建了startIpNum列,所以你在每次使用它的时候引用它:

GeoliteBlock.where('"startIpNum" >= ?', 2776360991) 

你和PostgreSQL得到的错误提到startipnum因为PostgreSQL的标准化标识符为小写(SQL标准说他们应该正常化为大写)。

此:

GeoliteBlock.find_by_startIpNum 2776360991 

作品,因为AR将引用您背后的startIpNuM部分。同样,GeoliteBlock.where(:startIpNum => 2776360991)也可以工作。

我建议您将模式更改为使用小写字段名称,以便您不必再担心这一点。

相关问题