2012-03-19 34 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)也可以工作。

我建議您將模式更改爲使用小寫字段名稱,以便您不必再擔心這一點。