2012-01-09 35 views
19

エラーを修正するのに少し問題があります。Rails 3.1。 Heroku PGError:演算子が存在しません:character varying = integer

すべてはローカルマシンでうまく動作します。 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

あなたの問題はここにある:

operator does not exist: character varying = integer

はそうあなたが文字列としてではなく、整数としてreviewsであなたのtrip_id列を作成しました:

WHERE "reviews"."trip_id" = 32 

とエラーメッセージがと言います。 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 

また、行うことができます保存したいデータがあり、change_columnが機能しない場合は、未処理SQLを使用してALTER TABLEを実行します。

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にデプロイする(または1つのデータベースの上で開発し、他のデータベースの上にデプロイする)ことは悪い考えであり、あらゆる種類の悲しみや混乱を引き起こします。

+0

感謝!モデルを作成すると、私はミスタイプ(文字列としての整数)のように見えます。 – emilsw

+2

はsqlite3が正常であるため、ローカルでは表示されませんでした。あなたは正しい、PGの上で開発を開始する時間。 – emilsw

+0

ちょっと@mu_is_too_short!それは長い時間だった;)質問、私はまだ文字列でこれを行うことが可能かどうか不思議です(あなたが本当にしなければならない場合)。 – Trip

1

あなたは、テキスト/ varcharデータ型として、列を離れて、整数としてそれを唱えられる...移行を行うには

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

簡単な方法はこれです:

change_column :reviews, :trip_id, 'integer USING CAST(trip_id AS integer)' 
関連する問題