我有一个 Rails 应用程序,它使用 Postgres 数据库和一个名为 geolite_blocks 的表。如果我这样调用 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)
但我知道该列存在,因为我只是用第一个代码示例查询了它。关于为什么会发生这种情况以及如何消除它的任何想法?感谢您的帮助!
最佳答案
SQL 中的列名不区分大小写,除非它们在创建时被引用。有人创建了您的 startIpNum
列并在其周围加上引号,因此您每次使用它时都必须引用它:
GeoliteBlock.where('"startIpNum" >= ?', 2776360991)
您从 PostgreSQL 收到的错误提到了 startipnum
,因为 PostgreSQL 将标识符规范化为小写(尽管 SQL 标准规定它们应该规范化为大写)。
这个:
GeoliteBlock.find_by_startIpNum 2776360991
之所以有效,是因为 AR 会在您背后引用 startIpNuM
部分。同样,GeoliteBlock.where(:startIpNum => 2776360991)
也可以。
我建议您将架构更改为使用小写的列名称,这样您就不必再担心这个了。
关于ruby-on-rails - ActiveRecord 列不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9765965/