2012-01-09 6 views
19

Tiene problemas para solucionar un error.Rieles 3.1. Heroku PGError: el operador no existe: carácter variable = número entero

Todo funciona muy bien en la máquina local. En PG, heroku es el error.

Éstos son los registros:

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

no muy seguro de dónde exactamente, se produce el error y cómo solucionarlo.

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> 

Lo que me confunde es que tengo dos otros prácticamente los mismos modelos, pero funcionan bien.

Gracias!

Respuesta

32

Su problema está aquí:

WHERE "reviews"."trip_id" = 32 

y el mensaje de error que dice:

operator does not exist: character varying = integer

por lo que han creado su columna trip_id en reviews como una cadena en lugar de como un entero. Eso funcionará bien en SQLite porque el sistema de tipos de SQLite es bastante flexible, pero no funcionará en PostgreSQL ya que PostgreSQL es bastante más estricto.

Usted podría intentar agregar una migración para fijar el tipo de trip_id:

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

y si eso no funciona, entonces soltar y volver a crear la tabla:

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

También puede hacer una ALTER TABLE a través de SQL sin formato si tiene datos que desea conservar y el change_column no funciona:

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

Eso debería funcionar en PostgreSQL (pero no en SQLite) siempre y cuando no tenga ningún dato roto en su trip_id.

Una vez que tenga eso resuelto, debe instalar PostgreSQL y cambiar su entorno de desarrollo a eso. Desarrollar sobre SQLite y desplegar en PostgreSQL (o desarrollar sobre una base de datos y desplegar sobre cualquier otra base de datos para el caso) es una mala idea y le causará todo tipo de dolor y confusión.

+0

Gracias ! Parece que escribí mal (entero como cadena) al crear un modelo. – emilsw

+2

no lo vio localmente ya que sqlite3 está bien con él. Tienes razón, es hora de comenzar a desarrollar sobre PG. – emilsw

+0

¡Hola @mu_is_too_short! Ha pasado mucho tiempo;) Pregunta, tengo curiosidad de si todavía sería posible hacer esto con una cuerda (si es que realmente se debe). – Trip

1

Se puede salir de la columna como un tipo de datos de texto/varchar, y proyectarlo como un entero ...

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

Una forma más sencilla de hacer la migración es la siguiente:

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