Rails / Postgres脆弱的测试环境没有创建正确的数据类型

时间:2013-05-14 18:12:05

标签: ruby-on-rails postgresql

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

然而,在我运行的Rails 3.2应用程序中:

rake db:test:prepare

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

1 个答案:

答案 0 :(得分:1)

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

我发现自己处于相同的情况,并且不得不求助于我自己的实现覆盖db:test:purge(在准备之前调用),因此它不会丢弃数据库而只会丢弃对象(基于的解决方案) '按用户名删除')。

使用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;它只是一个版本。