2012-01-09 84 views
19

糾正錯誤有點麻煩。Rails 3.1。 Heroku PGError:操作符不存在:字符變化=整數

所有的作品在本地機器上都很棒。 在PG上,heroku是錯誤的。

下面是日誌:

←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m ActionView::Template::Error (PGEr 
    ror: ERROR: operator does not exist: character varying = integer 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m LINE 1: ...T "reviews".* FROM "re 
    views" WHERE "reviews"."trip_id" = 32 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m : SELECT "reviews".* FROM "review 
    s" WHERE "reviews"."trip_id" = 32): 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m  31: <div style='display:non 
    e'> 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m  33:  <% for review in @tr 
    ip.reviews %> 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m  34: 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m  32: <div id="inline"> 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m HINT: No operator matches the gi 
    ven name and argument type(s). You might need to add explicit type casts. 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m app/controllers/trips_controlle 
    r.rb:21:in `show' 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m cache: [GET /trips/32] miss 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m  36:  <li> <%= review.conte 
    nt %> </li> 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m  35:  <ul> 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m app/views/trips/show.html.erb:3 
    3:in `_app_views_trips_show_html_erb__3301405670044045300_69859019468960' 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m Completed 500 Internal Server Err 
    or in 86ms 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m Parameters: {"id"=>"32"} 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m Processing by TripsController#s 
    how as HTML 
    ←[32m2012-01-09T19:52:24+00:00 app[web.1]:←[0m Rendered trips/show.html.erb with 
    in layouts/application (81.8ms) 

不能確定確切位置在哪裏,發生了錯誤,以及如何解決它。

reviews.rb

class Review < ActiveRecord::Base 
    belongs_to :trip 
end 

class Trip < ActiveRecord::Base 
    has_many :reviews, :dependent => :destroy 
    attr_accessible, :reviews_attributes 

    accepts_nested_attributes_for :reviews, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true 
end 

show.html.rb

<%= link_to "Read Reviews", '#inline', :id => 'various1', :class => 'review' %> 

<div style='display:none'> 
    <div id="inline"> 
     <% for review in @trip.reviews %> 
     <ul> 
     <li> <%= review.content %> </li> 
     <li> <i> <%= review.name %> </i> </li> 
     </ul> 
    <% end %> 
    </div> 
</div> 

,混淆我的是,我有兩個其他幾乎相同的車型,但他們的工作很好的事情。

謝謝!

回答

32

你的問題是在這裏:

WHERE "reviews"."trip_id" = 32 

和錯誤消息指出:

operator does not exist: character varying = integer

所以你在reviews創建了trip_id列作爲一個字符串,而不是作爲一個整數。這在SQLite中可以正常工作,因爲SQLite的類型系統相當寬鬆,但在PostgreSQL中不起作用,因爲PostgreSQL比較嚴格。

你可以嘗試將遷移到固定的trip_id類型:

def change 
    change_column :reviews, :trip_id, :integer 
end 

,如果不工作,然後刪除並重新創建表:

def change 
    drop_table :reviews 
    create_table :reviews do |t| 
    #... 
    t.integer :trip_id 
    #... 
    end 
end 

你也可以做一個通過原始SQL ALTER TABLE如果你有,你要保留數據和change_column不起作用:

def change 
    execute %q{ 
    alter table reviews 
    alter column trip_id 
    type int using cast(trip_id as int) 
    } 
end 

只要您的trip_id中沒有任何損壞的數據,就應該在PostgreSQL中工作(但不能在SQLite中)。

一旦你有了整理,你應該安裝PostgreSQL並切換你的開發環境。在SQLite之上開發並部署到PostgreSQL(或者在一個數據庫之上開發並在其他數據庫之上部署)是一個壞主意,會給你帶來各種悲傷和困惑。

+0

謝謝!它看起來像,我創建模型時輸入錯誤(整數作爲字符串)。 – emilsw 2012-01-09 21:46:58

+2

在本地沒有看到它,因爲sqlite3可以。你是對的,有時間開始在PG之上開發。 – emilsw 2012-01-09 21:51:58

+0

嘿@mu_is_too_short!這是很長的時間;)問題,我很好奇,如果仍然可以用一個字符串做到這一點(如果你真的必須)。 – Trip 2017-08-10 13:18:30

1

你可以離開列文本/ varchar數據類型,並且將它轉換爲一個整數...

WHERE "reviews"."trip_id"::int = 32 
1

一種更簡單的方式做遷移是這樣的:

change_column :reviews, :trip_id, 'integer USING CAST(trip_id AS integer)' 
相關問題