プレースホルダー を使用する必要があります 適切な形式を取得し、適切に引用されていることを確認するには:
t = Time.new
events = Event.where("datetime < :t", :t => t)
timestamp
を比較することはできません PostgreSQLでは整数の列ですが、SQLiteでは可能です。 timestamp
を比較する必要があります 別のtimestamp
を使用 (またはdate
)またはtimestamp
として解析できる文字列 。このSQLは機能しません:
SELECT "events".* FROM "events" WHERE (datetime < 132462148)
しかし、これらは次のようになります:
SELECT "events".* FROM "events" WHERE (datetime < '2011-12-23 06:52:25.096869')
SELECT "events".* FROM "events" WHERE (datetime < '2011-12-23')
ここにはいくつかの教訓があります:
- Herokuにデプロイする場合は、PostgreSQL上で開発を開始する必要があります。ActiveRecordは、さまざまなデータベース間のすべての違いからあなたを隔離するわけではありません。
- ActiveRecordに型変換の問題をできるだけ心配させる必要があります。日付や時刻と比較する場合は、プレースホルダーを使用して、ARに何らかの時間オブジェクトを渡して、ARに心配させてください。
- 可能な限り、文字列補間の代わりにプレースホルダーを使用してください。