2012-01-09 10 views
19

오류를 수정하는 데 약간의 문제가 있습니다.레일 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> 

제가 다른 두 거의 같은 모델을 가지고 있지만 잘 작동한다는 것입니다 혼란 것은.

감사합니다.

WHERE "reviews"."trip_id" = 32 

및 오류 메시지가 말한다 :

답변

32

귀하의 문제는 여기에있다

operator does not exist: character varying = integer

은 그래서 당신은 문자열로가 아닌 정수로 reviewstrip_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 :

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에 배포하거나 (또는 ​​하나의 데이터베이스를 기반으로 개발하고 다른 데이터베이스 위에 배포하는 것은 좋지 않은 생각입니다.) 모든 종류의 슬픔과 혼란이 발생할 것입니다.

WHERE "reviews"."trip_id"::int = 32 
+0

감사합니다 ! 모델을 만들 때 나는 실수 (문자열로 정수)를 한 것처럼 보입니다. – emilsw

+2

sqlite3가 로컬이므로 확인되지 않았습니다. 맞습니다. PG 개발을 시작할 시간입니다. – emilsw

+0

안녕하세요. @mu_is_too_short! 그것은 오랜 시간이 지났습니다;) 질문, 만약 당신이 정말로해야한다면 문자열로 이것을 할 수 있다면 궁금합니다. – Trip

1

... :

change_column :reviews, :trip_id, 'integer USING CAST(trip_id AS integer)' 
1

마이그레이션을 할 수있는 간단한 방법

이 당신이 텍스트/VARCHAR 데이터 유형으로 열을두고 정수로 캐스팅 할 수
관련 문제