0

開発環境がデフォルトでsqllite3に設定されて以来、RailsコードをHerokuにデプロイする際にいくつかの問題が発生しています。これは、次のログスナップショットです。

ActiveRecord::StatementInvalid (PG::Error: ERROR:  syntax error at or near ":"
2012-05-25T14:11:55+00:00 app[web.1]: 
2012-05-25T14:11:55+00:00 app[web.1]: LINE 1: ...LECT "records".* FROM "records"  WHERE (TIMESTAMP(:order) >=...
2012-05-25T14:11:55+00:00 app[web.1]: : SELECT "records".* FROM "records"  WHERE (TIMESTAMP(:order) >= '2011-05-25 00:00:00' and TIMESTAMP(:order) <= '2012-05-25 23:59:59') ORDER BY created_at):
2012-05-25T14:11:55+00:00 app[web.1]:   app/controllers/records_controller.rb:20:in `index'

コントローラファイルのコードフラグメント:

opts = {:order => "created_at"}
opts[:conditions] = (@start_date.nil? ? "" : "TIMESTAMP(created_at::text) >= '#{@start_date.to_s(:db)}'")
opts[:conditions] += ((@start_date.nil? || @end_date.nil?) ? "" : " and ")
opts[:conditions] += (@end_date.nil? ? "" : "TIMESTAMP(created_at::text) <= '#{@end_date.to_s(:db)}'")

もともと、タイムスタンプがある「DATETIME」があったので、切り替えても問題が発生します。このコードのコンテキストは、次の形式で日付間でクエリを実行していることです:2011-05-25 00:00:00

4

1 に答える 1

1

あなたcreated_atはすでに であるはずなので、それを;にキャストしようとtimestampする必要はありません。とにかく PostgreSQL では動作しません。SQLite にもそのようなものは必要ありません。TIMESTAMP(created_at::text)timestamptimestamp(x)

次のように SQL を実行することになります。

SELECT "records".*
FROM "records"
WHERE TIMESTAMP(:order) >= '2011-05-25 00:00:00'
  and TIMESTAMP(:order) <= '2012-05-25 23:59:59'
ORDER BY created_at

SQL のどこかで何かを変更created_at::text:orderています。私はその動作を再現できませんでしたが、名前付きのプレースホルダー (つまりcolumn = :value、 ではなくcolumn = ?) に違反していると思われますが、それは単なる推測です。

いずれにせよ、それらのものを取り除き、呼び出しtimestamp(...)を連鎖させることに切り替えると、より良いものが得られます:where

query = Record.order(:created_at)
query = query.where('created_at >= ?', @start_date) if(@start_date.present?)
query = query.where('created_at <= ?', @end_date)   if(@end_date.present?)

その後、最終結果を取得することができquery.allます。query.paginate(...)それは(IMHO)文字列のラングリングの山よりもはるかにきれいであり、どこでも同じように機能するはずです.

PostgreSQL (つまり Heroku) の上にデプロイする場合は、PostgreSQL 上で開発およびテストする必要があります。SQLite には、SQL とは何か、その型システムがどのように機能するかについていくつかの奇妙な考えがありますが、PostgreSQL は (ありがたいことに) それほど寛容ではありません。常に同じスタックで開発およびデプロイする必要があり、バージョン番号まで同じことが当てはまります。

于 2012-05-25T16:25:41.060 に答える