【问题标题】:Do I have to use some kind of index to use WHERE in Rails5 ActiveRecord?我是否必须使用某种索引才能在 Rails 5 ActiveRecord 中使用 WHERE?
【发布时间】:2017-01-13 21:19:01
【问题描述】:

我使用 Rails 5 和 Postgres。

我有一个 ZipRanges 表,其中包含 id、region_id、from、to 列

我想选择给定邮政编码介于 from 和 to 之间的所有行。

zip = 1234
ZipRange.where("from < ?", zip).where("to > ?", zip)

我收到以下错误:

ActiveRecord::StatementInvalid (PG::SyntaxError: ERROR: 语法错误 在“从”处或附近

我是否必须使用某种索引才能进行此查询?

我尝试了其他查询,它们工作正常。例如:

ZipRange.where("region_id = ?", 1)

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    From 是 Postgres 中的 reserved word(我猜其他数据库也是如此),因此您会收到此错误。但主要原因是您的查询设置不正确。

    你必须像这样格式化你的查询。

    ZipRange.where('zip >= :from AND zip <= :to', from: 1, to: 100)
    

    你也可以花点心思去做

    ZipRange.where(zip: 1..100)
    

    这也适用于变量

    from = params[:from]
    to = params[:to]
    ZipRange.where(zip: from..to)
    

    编辑: 根据下面的评论,这里还有一个版本

    ZipRange.where('from_column > :zip AND to < :zip', zip: 100)
    

    from_column 更改为您的新列名。

    【讨论】:

    • ZipRange.where(zip: 1..100) 创建WHERE zip BETWEEN 1 AND 100 可以提高性能。
    • 保留字的提示很棒。我刚刚更改了我的列名。请注意,我没有列 zip 并且想要找到 zip 位于两个值之间的行。该表具有 from 和 to 列,我想找出这两列大于和小于给定 zip 的行。
    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多