【问题标题】:Ruby on Rails: Active Record query fails to execute only when hosted on heroku.Ruby on Rails:Active Record 查询仅在托管在 heroku 上时无法执行。
【发布时间】:2012-09-07 02:44:30
【问题描述】:

我有一个页面,它只显示我的数据库中按投票计数排序的所有链接。这是控制器:

class PagesController < ApplicationController
  def index
    params[:per_page] ||= 5
    params[:page]     ||= 1

    @links = Link.order('voteCount DESC').paginate(:page => params[:page], :per_page => params[:per_page])

  end
end

我使用分页插件保存查询数据库,并在其前面添加:

.order('voteCount DESC')

当我在本地服务器上运行此命令时,它运行良好。但是,一旦我将它部署到heroku,它就会失败。这是我在控制台中检查日志/执行时得到的输出:

Link Load (2.0ms)  SELECT "links".* FROM "links" ORDER BY voteCount DESC LIMIT 5 OFFSET 0
ActiveRecord::StatementInvalid: PG::Error: ERROR:  column "votecount" does not exist
LINE 1: SELECT  "links".* FROM "links"  ORDER BY voteCount DESC LIMI...
                                                 ^

我使用控制台检查过,voteCount 列肯定存在。这可能是因为我的本地环境运行 sqlite3 而 heroku 让我使用 postgres ....

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: ruby-on-rails database sqlite postgresql heroku


    【解决方案1】:

    您有区分大小写的问题。当你说这样的话:

    create_table :links do |t|
      t.integer :voteCount
    end
    

    Rails 会将这样的 SQL 发送到 PostgreSQL 以创建列:

    "voteCount" integer
    

    标识符周围的双引号使其区分大小写,这意味着您必须永远将其称为"voteCount"。如果你这样说:

    .order('"voteCount" DESC')
    

    一切都会好起来的。

    SQLite 不关心标识符大小写,因此您可以在 SQLite 中说 voteCountvotecountVOTECOUNT、...,这无关紧要。

    Rails 总是引用它在与 PostgreSQL 对话时产生的标识符。通常这无关紧要,Rails 约定是使用小写标识符,而 PostgreSQL 在使用它们之前会将未加引号的标识符折叠为小写,因此默认情况下一切正常。

    这里有一些相关的最佳实践:

    1. 在同一个堆栈上开发和部署。
    2. 在 PostgreSQL 中使用带有下划线分隔的单词的小写列名。这也恰好符合通常的 Ruby 约定。

    我建议您改用vote_count 作为列名。

    【讨论】:

    • 非常感谢。我刚刚修好了。但我也切换到使用 postgresql 进行开发。
    【解决方案2】:

    您的 heroku 应用可能尚未迁移该列

    heroku run rake db:migrate
    

    【讨论】:

    • 我觉得这可能是区分大小写的问题。 stackoverflow.com/questions/203399/… MarkR 有一个很好的答案,我想在这里重申一下:不要为不同的环境使用不同的软件堆栈。你会得到很多这样的错误
    • postgresql 中的标识符不区分大小写,除非它们被引用。在您拥有的控制台输出查询中,没有引用“voteCount”。我很困惑。
    猜你喜欢
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 2020-05-13
    • 2011-04-14
    • 2021-06-11
    • 2012-02-05
    • 2011-08-29
    • 2018-05-22
    相关资源
    最近更新 更多