我使用citext
扩展是因为 Postgres 的缺点是没有全局功能来允许不区分大小写的搜索。
但是,在我运行的 Rails 3.2 应用程序中:
rake db:test:prepare
我的对象是使用text
数据类型创建的,而不是citext
. 如何强制上面的 rake 命令创建数据库并添加我的应用程序所需的扩展,以便进行应该已经烘焙的那种搜索?
我使用citext
扩展是因为 Postgres 的缺点是没有全局功能来允许不区分大小写的搜索。
但是,在我运行的 Rails 3.2 应用程序中:
rake db:test:prepare
我的对象是使用text
数据类型创建的,而不是citext
. 如何强制上面的 rake 命令创建数据库并添加我的应用程序所需的扩展,以便进行应该已经烘焙的那种搜索?
您需要将 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;这只是一个版本。