2011-12-23 12 views
1

"datetime"カラムの値が現在のunixタイムスタンプよりも小さいデータベース内のすべてのレコードを見つけるためにクエリを実行しようとしています。アクティブなレコードクエリーとヒロクに問題があります。

現在のところ私のコードです。ローカルで正常に動作します。

t = Time.new.to_i 
Event.where("datetime < #{t}") 

私はこれを英雄コンソールでテストするとこのエラーが発生します。

>> Event.where("datetime < #{t}") 
ActiveRecord::StatementInvalid: PGError: ERROR: operator does not exist: character varying < integer 
LINE 1: SELECT "events".* FROM "events" WHERE (datetime < 132462148... 
                 ^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 
: SELECT "events".* FROM "events" WHERE (datetime < 1324621488) 
    /app/.bundle/gems/ruby/1.9.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/postgresql_adapter.rb:1003:in `async_exec' 
    /app/.bundle/gems/ruby/1.9.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/postgresql_adapter.rb:1003:in `exec_no_cache' 
    /app/.bundle/gems/ruby/1.9.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/postgresql_adapter.rb:591:in `block in exec_query' 
    /app/.bundle/gems/ruby/1.9.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract_adapter.rb:244:in `block in log' 

+0

あなたはローカルでpostgresqlを使用していますか? – thatmiddleway

答えて

5

あなたは適切なフォーマットを取得し、それが適切に引用されていることを確認するためにplaceholderを使用する必要があります。

t  = Time.new 
events = Event.where("datetime < :t", :t => t) 

あなたはPostgreSQLの整数でtimestamp列を比較することはできませんが、あなたは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') 

いくつかの教訓がここにあります

  1. また、あなたがしている場合はPostgreSQLの上に開発を開始すべきですHerokuに展開しようとすると、ActiveRecordはさまざまなデータベース間の相違からあなたを守ることはできません。
  2. ActiveRecordは型変換の問題をできるだけ気にする必要があります。日付や時間と比較する場合はプレースホルダを使用し、ARには何らかの種類の時間オブジェクトを渡して、ARにそれを心配させます。
  3. 可能な限り、文字列補間の代わりにプレースホルダを使用します。
+0

ありがとうございます。これは私の問題を修正しました! – Jon