Heroku db: ошибка толчка (рельсы) - PullRequest
1 голос
/ 24 октября 2011

Когда я запускаю $ heroku db: push, я получаю следующую ошибку:

Saving session to push_201110231302.dat..
!!! Caught Server Exception
HTTP CODE: 500
Taps Server Error: PGError: ERROR:  value too long for type character varying(255)

Обсуждение здесь предполагает, что это потому, что одна из моих моделей имеет строковый атрибут, которыйдлиннее 255 символов.

Кажется, я обнаружил проблему в атрибуте "descrip" моей модели "Course".

Я попытался исправить это, изменив тип описания с строки на текст.Я сделал это, сгенерировав и запустив миграцию типа «remove_descrip_from_Course descrip: string», а затем сгенерировав / запустив «add_descrip_to_Course descrip: text».Но это не сработало - дескриптор по-прежнему отображается в виде строки.

Кто-нибудь знает, является ли (1) замена дескриптора со строки на текст лучшим (единственным?) Способом решения проблемы heroku,и (2) что я могу сделать, чтобы изменить описание с строки на текст?

Спасибо!

РЕДАКТИРОВАНИЕ:

Вот соответствующая часть моего файла schema.rb (описаниевнизу):

  create_table "courses", :force => true do |t|
    t.string   "name"
    t.string   "number"
    t.string   "instructor"
    t.string   "room"
    t.string   "day"
    t.string   "units"
    t.string   "time"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "limitations"
    t.string   "address"
    t.string   "end_time"
    t.string   "start_time"
    t.string   "crn"
    t.string   "term_code"
    t.text     "evals"
    t.boolean  "paper_required"
    t.string   "exam_type"
    t.string   "paper_type"
    t.string   "past_instructors"
    t.string   "past_semesters"
    t.string   "tod"
    t.boolean  "in_cart",          :default => false
    t.integer  "day_num"
    t.integer  "time_num"
    t.string   "units_alt"
    t.text     "descrip"
  end

А вот миграция add_descrip_to_course:

class AddDescripToCourse < ActiveRecord::Migration
  def self.up
    add_column :courses, :descrip, :text
  end

  def self.down
    remove_column :courses, :descrip
  end
end

Но вот что происходит в моей консоли rails:

ruby-1.9.2-p290 :008 > a = Course.new
 => #<Course id: nil, name: nil, number: nil, instructor: nil, room: nil, day: nil, units: nil, time: nil, created_at: nil, updated_at: nil, limitations: nil, address: nil, end_time: nil, start_time: nil, crn: nil, term_code: nil, evals: nil, paper_required: nil, exam_type: nil, paper_type: nil, past_instructors: nil, past_semesters: nil, tod: nil, in_cart: false, day_num: nil, time_num: nil, units_alt: nil, descrip: nil> 
ruby-1.9.2-p290 :009 > a.descrip = "test"
 => "test" 
ruby-1.9.2-p290 :010 > a.descrip.class
 => String 

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

Ваш первый шаг - разработка и развертывание в одном стеке;разработка поверх MySQL или SQLite, а затем развертывание поверх PostgreSQL просто порождает проблемы, PostgreSQL (к счастью) намного строже, чем SQLite и MySQL.Так что устанавливайте PostgreSQL локально, если вы собираетесь развертывать на Heroku.

Чтобы изменить тип столбца, вы сможете использовать его при миграции:

def self.up # or "def change" or "def up" depending on your Rails version
    change_column :courses, :descrip, :text
end

Это должно датьВы столбец типа TEXT в PostgreSQL и TEXT - это тип символа «переменная неограниченная длина».

Использование :text для этого - лучший способ получить произвольнобольшой текстовый столбец.

Если вы на самом деле не хотите неограниченную длину, вам следует включить проверку длины в вашу модель.MySQL будет молча обрезать ваши данные, а SQLite игнорирует длину строковых столбцов, PostgreSQL не делает ничего из этого.

В мире Rails / ActiveRecord все строковые типы являются экземплярами String, поэтому char(n), varchar(n)text все выступают как String и входят как String.

0 голосов
/ 24 октября 2011

Однажды у меня была похожая проблема (мне пришлось изменить строку на текст), и я столкнулся с теми же препятствиями. В конце концов мне пришлось выполнить миграцию, которая отбросила всю таблицу и снова воссоздала с соответствующими типами столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...