Rails 3.1. Heroku PGError: operator does not exist: 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>

Меня смущает то, что у меня есть еще две практически такие же модели, но они работают хорошо.

Спасибо!

23
задан mu is too short 9 January 2012 в 21:41
поделиться

3 ответа

Ваша проблема здесь:

WHERE "reviews"."trip_id" = 32

и сообщение об ошибке говорит, что:

оператор не существует: переменная персонажа = целое число

поэтому вы создали свой столбец trip_id в reviews как строку, а не как целое число. Это будет хорошо работать в 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

Вы также можете выполнить команду ALTER TABLE через сырой SQL, если у вас есть данные, которые вы хотите сохранить, а change_column не работает:

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

Это должно работать в PostgreSQL (но не в SQLite) так долго поскольку у вас нет поврежденных данных в trip_id.

Как только вы разобрались с этим, вы должны установить PostgreSQL и переключить вашу среду разработки на это. Разработка поверх SQLite и развертывание на PostgreSQL (или разработка поверх одной базы данных и развертывание поверх любой другой базы данных в этом отношении) - плохая идея, которая вызовет у вас всевозможные горе и растерянность.

35
ответ дан 29 November 2019 в 02:03
поделиться

Вы можете оставить столбец как тип данных text / varchar и привести его к целому числу ...

WHERE "reviews"."trip_id"::int = 32
3
ответ дан 29 November 2019 в 02:03
поделиться

Более простой способ выполнить миграцию заключается в следующем:

change_column :reviews, :trip_id, 'integer USING CAST(trip_id AS integer)'
2
ответ дан 29 November 2019 в 02:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: