PostgreSQL + Rails citext

时间:2010-04-12 05:12:39

标签: ruby-on-rails postgresql activerecord case-insensitive

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

有没有办法使用:带有rails的citext(这样如果在MySQL上运行迁移,citext只会使用字符串/文本?

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

5 个答案:

答案 0 :(得分:3)

Rails 4.2 +

Rails 4.2对citext列类型具有原生支持。

Rails< 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

答案 1 :(得分:1)

仅供记录。似乎rails 4.2对此有本机支持。

  

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

正如其他人提到的那样,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

答案 4 :(得分: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