由於Postgres的缺點,我使用citext
擴展,因爲沒有全局功能來允許區分大小寫的搜索。Rails/Postgres脆弱的測試環境無法創建正確的數據類型
然而,在我的Rails 3.2應用程序,當我運行:
rake db:test:prepare
我的對象與text
數據類型創建的,而不是citext
。如何強制執行上面的rake命令來創建數據庫並添加我的應用程序需要的擴展名,以便進行那種應該僅僅被烘焙的搜索?
由於Postgres的缺點,我使用citext
擴展,因爲沒有全局功能來允許區分大小寫的搜索。Rails/Postgres脆弱的測試環境無法創建正確的數據類型
然而,在我的Rails 3.2應用程序,當我運行:
rake db:test:prepare
我的對象與text
數據類型創建的,而不是citext
。如何強制執行上面的rake命令來創建數據庫並添加我的應用程序需要的擴展名,以便進行那種應該僅僅被烘焙的搜索?
您需要將citext擴展添加到您的測試數據庫。不幸的是,在db:test的標準實現中:準備數據庫被刪除並重新創建,所以擴展消失了。
我發現自己在相同的情況下,不得不訴諸覆蓋db:test:purge(這是在準備之前調用)與我自己的實現,所以而不是刪除數據庫,它只會刪除對象(基於解決方案關於'DROP OWNED BY username')。
更新與耙任務代碼: 所以我的耙任務看起來像這樣。我把它放在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會很好;它只是一個版本。
我不認爲你會願意分享。我會爲此付出賞金。 – AKWF 2013-05-14 18:42:17
我很樂意分享 – boulder 2013-05-14 19:21:30
感謝巨石。直到問題出現2天后,我才能得到賞金。那麼我會把你勾起來。與此同時,我循環遍歷所有AR模型,將所有屬性名稱都包含在「字符變化」中,並使用ALTER TABLE命令轉換列。但是,我需要您的解決方案的另一個原因:每次運行db:test:prepare時,所有支持的只讀模式都會被刪除。 – AKWF 2013-05-14 19:27:31