I ran into an error when I was pushing the last eager-loading app onto Heroku. I had the following error
2014-03-13T07:45:24.207959+00:00 app[web.1]: : SELECT products.*, categories.name as category_name FROM "products" INNER JOIN "categories" ON "categories"."id" = "products"."category_id" ORDER BY categories.name):
2014-03-13T07:45:24.207959+00:00 app[web.1]: 13: <% @products.each do |product| %>
2014-03-13T07:45:24.207959+00:00 app[web.1]: 14: <tr>
2014-03-13T07:45:24.208979+00:00 app[web.1]: 15: <td><%= link_to product.name, product %></td>
2014-03-13T07:45:24.208979+00:00 app[web.1]: 16: <td><%= number_to_currency product.price %></td>
2014-03-13T07:45:24.208979+00:00 app[web.1]: app/views/products/index.html.erb:13:in `_app_views_products_index_html_erb___1529240047445058566_70114821600640'
2014-03-13T07:45:24.208979+00:00 app[web.1]:
2014-03-13T07:45:24.208979+00:00 app[web.1]:
2014-03-13T07:45:24.208979+00:00 app[web.1]: I, [2014-03-13T07:45:24.200411 #2] INFO -- : Started GET "/" for 98.207.180.92 at 2014-03-13 07:45:24 +0000
2014-03-13T07:45:24.208979+00:00 app[web.1]: I, [2014-03-13T07:45:24.201343 #2] INFO -- : Processing by ProductsController#index as HTML
2014-03-13T07:45:24.208979+00:00 app[web.1]: E, [2014-03-13T07:45:24.204799 #2] ERROR -- : PG::UndefinedFunction: ERROR: operator does not exist: integer = character varying
After some searching around I found that my category_id
on my products
table was set to the datatype of string
. My first attempt to fix this was to change the datatype of the category_id
directly.
class ChangeCategoryIdInProducts < ActiveRecord::Migration
def self.up
change_column :products, :category_id, :integer
end
def self.down
change_column :products, :category_id, :string
end
end
but this gave the error of
PG::DatatypeMismatch: ERROR: column "category_id" cannot be cast automatically to type integer
So directly changing the column does work, so I went with a stronger method. I removed the column category_id
that was a string, and I added another column category_id
that was an integer.
class ChangeCategoryIdForProducts < ActiveRecord::Migration
def self.up
remove_column :products, :category_id
add_column :products, :category_id, :integer
end
def self.down
remove_column :products, :category_id
add_column :products, :category_id, :string
end
end
This solved the problem I was having, but when I wanted to run rake db:reset
Heroku gave me
FATAL: permission denied for database "postgres"
DETAIL: User does not have CONNECT privilege.
This is because you cannot drop a PG database on Heroku. The documentation mentions that you could run heroku pg:reset
, but I was unable to get that working. I instead manually deleted the herokuapp, then re-uploaded the app onto heroku. When doing this, you have to remember to also remove the git remote the heroku toolbelt generated.