7

我正在尝试迁移到使用 PostgreSQL 8.4 的 heroku,它有一个 citext 列类型,因为该应用程序是为 MySQL 编写的,所以这很好。

有什么方法可以将 :citext 与 rails 一起使用(这样如果迁移在 MySQL 上运行,那么 citext 将只使用字符串/文本?

我找到了这张票,但它似乎暂时不会成为 Rails 的一部分: https ://rails.lighthouseapp.com/projects/8994/tickets/3174-add-support-for-postgresql- citext 列类型

4

5 回答 5

9

导轨 4.2+

Rails 4.2 原生支持citext列类型。

导轨 < 4.2

如果您使用的是 Rails < 4.2,您可以尝试使用activerecord-postgresql-citext gem。

这允许您像这样编写迁移:

def up
  enable_extension("citext")                   

  create_table :models, :force => true do |t|  
    t.citext :name                             
    t.timestamps                               
  end                                          
end
于 2014-09-03T19:31:26.833 回答
2

正如其他人所提到的,Rails 现在已经原生支持citext列类型(从 4.2 开始)。

要迁移现有列,您需要启用 citext 扩展,然后change_column. 更改列是不可逆的,因此您需要单独的updown方法。

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
于 2019-05-29T20:26:30.737 回答
1

只是为了记录。似乎 rails 4.2 对此有本机支持。

在 PostgreSQL 适配器中添加了对 citext 列类型的支持。

http://guides.rubyonrails.org/4_2_release_notes.html

于 2015-04-17T15:47:54.480 回答
0

我很确定 Rails 只有有限的数据类型词汇。您可能必须使用良好的老式 SQL 来处理任何其他类型。

于 2010-04-16T03:22:52.370 回答
0

对于任何想要将现有string列更改为 的人citext,请尝试创建迁移

rails g migration change_username_from_string_to_citext

然后让迁移看起来像这样

class ChangeUsernameFromStringToCitext < ActiveRecord::Migration[6.0]
  def change
    enable_extension("citext") # Don't forget this line
    change_column :users, :username, :citext
  end
end
于 2020-10-29T13:11:35.870 回答