当我运行$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)
讨论here表明这是因为我的一个模型的字符串属性超过255个字符。
我想我在“课程”模型的“描述”属性中发现了问题。
我尝试通过将EXPLP的类型从字符串更改为文本来修复这个问题。为此,我生成并运行了一个“remove_descrip_from_Course descrip:string”类型迁移,然后生成/运行了一个“add_descrip_to_Course descrip:text”,但这不起作用——descrip仍然显示为一个字符串。
有人知道(1)将descrip从字符串更改为文本是否是最好的(仅限?)解决heroku问题的方法,以及(2)如何将descrip从字符串更改为文本?
谢谢!
编辑:
下面是schema.rb文件的相关部分(descrip在底部):
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_课程迁移:
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
最佳答案
第一步是在同一个堆栈上开发和部署;在MySQL或SQLite上开发然后在PostgreSQL上部署只是自找麻烦,PostgreSQL(谢天谢地)比SQLite和MySQL严格得多。因此,如果要部署到Heroku,请在本地安装PostgreSQL。
若要更改列类型,您应该能够在迁移中使用它:
def self.up # or "def change" or "def up" depending on your Rails version
change_column :courses, :descrip, :text
end
这将为您提供PostgreSQL中
TEXT
类型的列和TEXT
is一个“可变无限长度”字符类型。为此使用
:text
是获得任意大文本列的最佳方法。如果您真的不需要无限长度,那么应该在模型中包含长度验证。MySQL会自动截断数据,而SQLite会忽略字符串列的长度,PostgreSQL不会做这两件事。
在Rails/ActiveRecord世界中,所有stringish类型都是String的实例,因此
char(n)
、varchar(n)
和text
都以String的形式出现并以String的形式进入。