0

現在、この 1 つの ActiveRecord クエリからエラーをスローし続ける Heroku のアプリがあります。

if category == "-1"
    where('category_id IS null')
else
    where('category_id IS ?', category)
end

'category_id IS null を使用した最初のクエリは正常に機能しますが、2 番目のクエリでは次のようなエラーがスローされます。

2012-08-16T18:58:03+00:00 app[web.1]:
2012-08-16T18:58:03+00:00 app[web.1]:
2012-08-16T18:58:03+00:00 app[web.1]: Started GET "/items?cpath=4" for 204.154.121.30            at 2012-08-16 18:58:03 +0000
2012-08-16T18:58:08+00:00 app[web.1]:
2012-08-16T18:58:08+00:00 app[web.1]: ActiveRecord::StatementInvalid (PGError: ERROR:  syntax error at or near "4"
2012-08-16T18:58:08+00:00 app[web.1]: LINE 1: SELECT COUNT(*) FROM "items"  WHERE (category_id IS 4)
2012-08-16T18:58:08+00:00 app[web.1]:                                                             ^
2012-08-16T18:58:08+00:00 app[web.1]:   app/controllers/items_controller.rb:30:in `index'
2012-08-16T18:58:08+00:00 app[web.1]: : SELECT COUNT(*) FROM "items"  WHERE (category_id IS 4)):
2012-08-16T18:58:08+00:00 app[web.1]:
2012-08-16T18:58:08+00:00 app[web.1]:
2012-08-16T18:58:08+00:00 app[web.1]: cache: [GET /items?cpath=4] miss
2012-08-16T18:58:08+00:00 app[web.1]:   Processing by ItemsController#index as HTML
2012-08-16T18:58:08+00:00 app[web.1]:   Parameters: {"cpath"=>"4"}
2012-08-16T18:58:08+00:00 app[web.1]: Completed 500 Internal Server Error in 3ms
2012-08-16T18:58:08+00:00 heroku[router]: GET yisifahan.herokuapp.com/items?cpath=4 dyno=web.1 queue=0 wait=0ms service=
5026ms status=500 bytes=728
2012-08-16T18:58:08+00:00 heroku[web.1]: Error R12 (Exit timeout) -> At least one process failed to exit within 10 seconds of SIGTERM
2012-08-16T18:58:08+00:00 heroku[web.1]: Stopping remaining processes with SIGKILL
2012-08-16T18:58:09+00:00 heroku[web.1]: Process exited with status 137

この問題を解決する方法を知っている人はいますか?ありがとう。

4

2 に答える 2

2

where(category_id: category)代わりに、データベースに依存しないようにしてください。

開発環境に mysql または sqlite がありますよね?

于 2012-08-16T19:15:58.310 に答える
2

IS比較演算子は等価には無効だと思います。(http://www.postgresql.org/docs/9.2/static/functions-comparison.html)

したがって、スニペットは次のようになります。

if category == "-1"
  where('category_id IS null')
else
  where('category_id = ?', category)
end

正直なところ、これらのケースについてコードをチェックするいくつかのテストが必要です。そのようにサーバーに侵入するべきではありませんでした。また、開発環境で postgres データベースを使用することをお勧めします。これにより、コードがそのアーキテクチャに対して有効であることを確認できます。

于 2012-08-16T19:16:32.343 に答える