我正在尝试迁移到使用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
答案 0 :(得分:3)
Rails 4.2对citext
列类型具有原生支持。
如果你正在使用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列类型的支持。
答案 2 :(得分:0)
我很确定Rails只有有限的数据类型词汇表。您可能必须使用良好的老式SQL来处理任何其他类型。
答案 3 :(得分:0)
正如其他人提到的那样,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
答案 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