Ruby on Rails的varchar迁移问题

39

我创建了一个新的表,其中包括一个名为“note”的列。默认情况下,它应该是varchar(255),但是我希望将此列更改为文本区域而不是字段,并允许存储更多数据。我想我需要在ActiveRecord :: Migration文件中进行更改,但是我想知道格式。例如,我只需将varchar(255)更改为varchar(1000)吗?(如果是这样,格式是什么?

def self.up
    create_table :notes do |t|
      t.string :note :varchar(1000)
    end

这是正确的格式吗?此外,如何使输入字段成为多行。对不起,如果这很简单但我是编程和RoR的新手。谢谢。

4个回答

83

30

您可以使用limit选项来更改长度,例如:

def self.up
  change_column :notes, :note, :string, :limit => 1000
end

我必须通过终端执行脚本/生成迁移...命令并编辑新文件来进行此更改吗?还是我可以直接打开原始迁移文件进行更改,保存并运行rake db:migrate命令? - bgadoci
如果这是最后创建的表之一,你处于开发模式等情况,则回滚。检查schema.rb以查看列是否不再列出,然后编辑迁移并再次运行db migrate。如果字段中有数据,则此方法无效。 - Tom Andersen
1
如果您想保留一个varchar,这是正确的答案,请注意您需要MySQL 5.0.3或更高版本才能使用大于255的限制(http://dev.mysql.com/doc/refman/5.0/en/char.html)。 - Kris

23
你可以直接使用“text”类型,而不是“string”类型。
def self.up
  create_table :notes do |t|
    t.text :note
  end
end

使用“text”类型将导致数据库列的类型为TEXT。在MySQL中,Varchar通常限制为最大长度为255(其他RDBMS具有类似的限制)。
如果您使用Rails的表单帮助程序,对于此字段将输出一个textarea(因为它是“text”类型)。textarea是接受多行输入的表单元素。
编辑:如果您已经迁移了create_table,则可以创建一个新的迁移来更改列的类型:
def self.up
  change_column :notes, :note, :text
end

如果在生成此迁移后从未调用过db:migrate,则可以在调用db:migrate之前简单地编辑该文件。否则,您可以创建一个新的迁移来进行更改:def self.up change_column :notes, :note, :text end(注:此为程序开发相关内容,建议由专业人士进行翻译以确保准确性) - Siddhartha Reddy
这是我放置它的地方吗?class CreateNotes < ActiveRecord::Migration def self.up create_table :notes do |t| t.string :note t.string :prospect change_column :notes, :note, :textarea t.timestamps end end - bgadoci
这正是我所需要的。感谢您将其分解。很抱歉我这么需要帮助!我已经进行了三天。 - bgadoci
Rails为其脚本提供了不错的内联帮助,您可能会发现它很有用。只需调用命令而不带任何参数即可访问此帮助。例如,“scrip/generate migration”显示有关如何创建迁移的帮助。 - Siddhartha Reddy
VARCHAR 在 MySQL 5.0.3 及以后的版本 中最大可达64K。 - David Moles
显示剩余5条评论

7

由于我已经存储了大量数据,所以我使用了

self.up
  change_column :notes, :note, :text, :limit => nil
end

如果我省略了:limit => nil选项,那么列类型将从varchar更改为text,但仍然具有255个字符的最大长度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接