在Rails迁移中,如何删除字段的限制?

53

以下内容是否正确?

 change_column :tablename, :fieldname, :limit => null
6个回答

111
如果你之前在迁移中指定了一个限制,但现在想要删除这个限制,可以简单地执行以下操作:
change_column :users, :column, :string, :limit => 255

字符串列的标准长度为255,Rails将会忽略你之前指定的限制。

更新:

虽然这在许多Rails版本中可以使用,但是最好像Giuseppe的答案一样使用nil

change_column :users, :column, :string, :limit => nil

这意味着你唯一做错的事情是使用了null而不是nil


35

以下是我的经历。

我意识到一个表中的字符串字段无法容纳其内容,因此我生成了一个包含以下内容的迁移:

def self.up
  change_column :articles, :author_list, :text
end

运行迁移后,数据库模式发生了以下变化:

create_table "articles", :force => true do |t|
  t.string   "title"
  t.text     "author_list", :limit => 255
end

原来的方法不可行。因此,我按照以下方式重新执行了迁移:

def self.up
  # careful, it's "nil", not "null"
  change_column :articles, :author_list, :text, :limit => nil
end

这次,在schema.rb中限制已经消失了:

create_table "articles", :force => true do |t|
  t.string   "title"
  t.text     "author_list"
end

对我来说,我需要运行rake db:migrate:reset才能真正改变限制,但是要小心使用这个命令,因为它会删除数据库。 - p1100i

3
将列类型更改为:text。它没有限制。
change_column :tablename, :fieldname, :text, :limit => nil

1
这是不正确的...如果你只是从:string改为:text,rake db:migrate将保留限制,当你尝试执行heroku rake db:schema:load时会出现问题。 - jpw

0
为了使其与数据库驱动程序无关,应该编写类似以下内容的代码:
add_column :tablename, :fieldname_tmp, :text
Tablename.reset_column_information
Tablename.update_all("fieldname_tmp = fieldname")
remove_column :tablename, :fieldname
rename_column :tablename, :fieldname_tmp, :fieldname

0
今天我也遇到了同样的问题,尝试去除文本字段的限制,但无法成功。我尝试了几次迁移。
Rails 4.2.7.1 Ruby 2.3.1p112
最终,唯一有效的方法是指定一个255的限制。调整为其他任何值都不起作用。

0

字符串没有限制并不是大多数数据库支持的功能:您必须在 varchar(SIZE) 定义中指定大小。
虽然您可以尝试,但我个人会选择 :limit => BIG_ENOUGH_NUMBER。您还可以考虑使用 CLOB 类型处理非常大的文本。


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