2

私のデータベース内のすべてのリンクをvoteCountでソートしただけのページがあります。コントローラは次のとおりです。

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

paginateプラグインを使用してデータベースにクエリを保存し、その前に次のコマンドを追加します。

.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を使用していることが原因である可能性があります...。

どんな助けでも本当にありがたいです。ありがとう。

4

2 に答える 2

4

大文字と小文字の区別に問題があります。あなたが次のようなことを言うとき:

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

Railsは次のようなSQLをPostgreSQLに送信して列を作成します。

"voteCount" integer

識別子を二重引用符で囲むと大文字と小文字が区別されます。つまり、識別子を"voteCount"永遠に参照する必要があります。あなたがこれを言うならば:

.order('"voteCount" DESC')

すべてが機能するはずです。

SQLiteは識別子の大文字小文字を気にしないので、SQLiteで、、、 ...と言うことができvoteCountvotecountそれVOTECOUNTは問題ではありません。

Railsは、PostgreSQLと通信するときに生成する識別子を常に引用します。通常、これは問題ではありません。Railsの規則では小文字の識別子を使用し、PostgreSQLは引用符で囲まれていない識別子を使用する前に小文字に折りたたむため、すべてがデフォルトで機能します。

ここには、いくつかの関連するベストプラクティスがあります。

  1. 同じスタックで開発およびデプロイします。
  2. PostgreSQLでは、アンダースコアで区切られた単語を含む小文字の列名を使用します。これは、通常のRubyの規則とも一致します。

vote_count代わりに、列名として使用することをお勧めします。

于 2012-09-14T02:09:31.713 に答える
1

Herokuアプリには、おそらくその列がまだ移行されていません

heroku run rake db:migrate
于 2012-09-13T23:07:30.250 に答える