正如其他人所提到的,Rails 现在已经原生支持citext
列类型(从 4.2 开始)。
要迁移现有列,您需要启用 citext 扩展,然后change_column
. 更改列是不可逆的,因此您需要单独的up
和down
方法。
class ConvertUserNameToCaseInsensitive < ActiveRecord::Migration[6.0]
def up
enable_extension 'citext' # only the first migration you add a citext column
change_column :user, :name, :citext
end
def down
change_column :user, :name, :string
disable_extension 'citext' # reverse order, only the first migration you add a citext column (this will be the last time you remove one in a rollback)
end
end
仅当您最后一次在回滚时删除 citext 列时才需要禁用扩展,因此与其添加难看的注释,最好进行单独的迁移并在提交消息中解释原因:
# migration 1.rb
class EnableCitext < ActiveRecord::Migration[6.0]
def change
enable_extension 'citext'
end
end
# migration 2.rb
class ConvertUserNameToCaseInsensitive < ActiveRecord::Migration[6.0]
def up
change_column :user, :name, :citext
end
def down
change_column :user, :name, :string
end
end