0

我使用citext扩展是因为 Postgres 的缺点是没有全局功能来允许不区分大小写的搜索。

但是,在我运行的 Rails 3.2 应用程序中:

rake db:test:prepare

我的对象是使用text数据类型创建的,而不是citext. 如何强制上面的 rake 命令创建数据库并添加我的应用程序所需的扩展,以便进行应该已经烘焙的那种搜索?

4

1 回答 1

1

您需要将 citext 扩展名添加到您的测试数据库。不幸的是,在 db:test:prepare 的标准实现中,数据库被删除并重新创建,因此扩展消失了。

我发现自己处于同样的情况,不得不用我自己的实现来覆盖 db:test:purge (在准备之前调用),所以它不会删除数据库,而只会删除对象(基于 'DROP OWNED 的解决方案通过用户名')。

使用 rake 任务代码更新:所以我的 rake 任务看起来像这样。我把它放在 lib/tasks/overrides/database.rake 上;但这取决于你。

 namespace :db do  
   namespace :test do
     task :purge => []
     Rake::Task["purge"].clear

     # desc overrides default task to drop all objects in database instead of the db itself (only postgresql)
     task :purge => [:environment, :load_config] do
       abcs = ActiveRecord::Base.configurations
       case abcs['test']['adapter']
         when /postgresql/
           # original implementation commented out
           #ActiveRecord::Base.clear_active_connections!
           #drop_database(abcs['test'])
           #create_database(abcs['test'])
           drop_database_objects(abcs['test'])
       end
     end
   end
 end

 def drop_database_objects(config)
   case config['adapter']
   when /postgresql/
     ActiveRecord::Base.establish_connection(config)
     sql = "DROP OWNED BY #{config['username']}"
     ActiveRecord::Base.connection.execute sql 
   end 
 end

我省略了未更改的部分,但您可以在database.rake看到原始部分。注意:我发现 Postgresql 9.2.2 的 DROP OWNED BY 有问题,你可以使用 9.2.1 和 9.2.3;这只是一个版本。

于 2013-05-14T18:22:21.743 回答