2012-01-09 8 views
19

Problem z usunięciem błędu.Szyny 3.1. Heroku PGError: operator nie istnieje: znak różny = liczba całkowita

Wszystko działa świetnie na lokalnym komputerze. Na PG, heroku jest błędem.

Oto kłody:

←[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) 

Nie bardzo wiadomo, gdzie dokładnie występuje błąd i jak go naprawić.

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> 

Rzecz, która mnie niepokoi to, że mam dwa inne praktycznie takie same modele, ale działa dobrze.

Dzięki!

Odpowiedz

32

Twój problem jest tutaj:

WHERE "reviews"."trip_id" = 32 

a komunikat o błędzie mówi, że:

operator does not exist: character varying = integer

tak utworzeniu kolumny trip_id w reviews jako ciąg znaków, a nie jako liczba całkowita. To sprawdzi się dobrze w SQLite, ponieważ system typu SQLite jest dość luźny, ale nie będzie działał w PostgreSQL, ponieważ PostgreSQL jest dość ostry.

Można spróbować dodać migrację ustalić rodzaj trip_id:

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

a jeśli to nie poskutkuje, to usunąć i odtworzyć tabelę:

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

Można również zrobić ALTER TABLE przez surowy SQL, jeśli masz dane, które chcesz zachować i change_column nie działa:

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

To powinno działać w PostgreSQL (ale nie w SQLite), o ile nie masz żadnych uszkodzonych danych w swoim trip_id.

Po zakończeniu sortowania należy zainstalować PostgreSQL i zmienić środowisko programistyczne na takie. Rozwój na bazie SQLite i wdrażanie PostgreSQL (lub rozwijanie na bazie jednej bazy danych i wdrażanie na szczycie jakiejkolwiek innej bazy danych) jest złym pomysłem i spowoduje wiele rodzajów żalu i zamieszania.

+0

Dzięki ! Wygląda na to, że podczas tworzenia modelu źle wpisałem (jako ciąg). – emilsw

+2

nie widziałem go lokalnie, ponieważ sqlite3 jest z nim w porządku. Masz rację, Czas zacząć rozwijać się nad PG. – emilsw

+0

Hej @mu_is_too_short! Minęło dużo czasu;) Pytanie, jestem ciekawy, czy nadal można to zrobić za pomocą ciągu znaków (jeśli naprawdę musiałeś). – Trip

1

Mogłeś zostawić kolumnę jako typ danych text/varchar, i wrzucił je jako liczbę całkowitą ...

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

Prostszym sposobem na migrację to:

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