ruby-on-rails - ActiveRecord 列不存在

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

我有一个 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/

相关文章:

ruby-on-rails - 使用 rails composer 创建了应用程序,但无法在应用程序目录中启动 rails

ruby-on-rails - 每当我创建新的 Rails 应用程序时,如何创建 Postgres 用户和数据库?

mysql - 使用 ActiveRecord 使用 OR 子句进行查询的 "Rails Way"是什么?

ruby-on-rails - 如何避免通过关联在 has_many 连接表中创建重复记录?

ruby-on-rails - 如何用 RSpec 测试覆盖 ActiveAdmin 资源的一部分?

ruby-on-rails - 通过电子邮件访问 Paypal 账户

html - #{} 不适用于 ruby​​ on rails

ruby-on-rails - PostgreSQL Database Browser for Rails 3.2 app - Induction App instead of SQLite Database Browser

postgresql - 在事务完成后执行触发器

ruby-on-rails - 我可以在 after_commit(在 : :create) callback? 上)更新 Active Record