2011-12-23 84 views
1

我只是試圖運行查詢來查找數據庫中的所有記錄在「datetime」列中的值小於當前的unix時間戳。活動記錄查詢和heroku問題。

目前這是我的代碼。它在當地運行良好。

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

當我在heroku控制檯中測試這個錯誤時,我得到這個錯誤。

>> 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 2011-12-23 06:40:19

回答

5

你應該使用placeholder得到正確的格式,並確保它被正確引用:

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') 

這裏有幾個教訓:

  1. 你也應該開始,如果你對PostgreSQL的頂部發展將部署到Heroku,ActiveRecord不會使您免受各種數據庫之間的所有差異的困擾。
  2. 你應該讓ActiveRecord儘可能地擔心類型轉換的問題,如果你正在比較一個日期或時間,使用佔位符並且手工處理某種時間對象,讓AR擔心它。
  3. 儘可能使用佔位符而不是字符串插值。
+0

謝謝。這解決了我的問題! – Jon 2011-12-23 07:49:51