Рельсы 3.1. Heroku PGError: оператор не существует: character variableing = integer
У вас есть небольшая проблема с исправлением ошибки.
Все работает отлично на локальной машине.
На PG ошибка героя - это ошибка.
Вот журналы:
←[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>
Меня смущает то, что у меня есть две другие практически одинаковые модели, но они хорошо работают.
Спасибо!
Ответы
Ответ 1
Ваша проблема здесь:
WHERE "reviews"."trip_id" = 32
и сообщение об ошибке говорит, что:
Оператор не существует: character variableing = integer
поэтому вы создали столбец 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 через raw 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 (или разработка поверх одной базы данных и развертывание поверх любой другой базы данных, если на то пошло) - плохая идея и вызовет у вас все виды горя и путаницы.
Ответ 2
Вы можете оставить столбец как тип данных text/varchar и передать его как целое число...
WHERE "reviews"."trip_id"::int = 32
Ответ 3
Простейший способ миграции - это:
change_column :reviews, :trip_id, 'integer USING CAST(trip_id AS integer)'