2013-05-14 50 views
0

由於Postgres的缺點,我使用citext擴展,因爲沒有全局功能來允許區分大小寫的搜索。Rails/Postgres脆弱的測試環境無法創建正確的數據類型

然而,在我的Rails 3.2應用程序,當我運行:

rake db:test:prepare 

我的對象與text數據類型創建的,而不是citext。如何強制執行上面的rake命令來創建數據庫並添加我的應用程序需要的擴展名,以便進行那種應該僅僅被烘焙的搜索?

回答

1

您需要將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會很好;它只是一個版本。

+0

我不認爲你會願意分享。我會爲此付出賞金。 – AKWF 2013-05-14 18:42:17

+0

我很樂意分享 – boulder 2013-05-14 19:21:30

+0

感謝巨石。直到問題出現2天后,我才能得到賞金。那麼我會把你勾起來。與此同時,我循環遍歷所有AR模型,將所有屬性名稱都包含在「字符變化」中,並使用ALTER TABLE命令轉換列。但是,我需要您的解決方案的另一個原因:每次運行db:test:prepare時,所有支持的只讀模式都會被刪除。 – AKWF 2013-05-14 19:27:31

相關問題