2011-07-08 46 views
7

我嘗試使用下列方式我的一些遷移的輔助數據庫連接:多個數據庫連接:schema_migrations在錯誤的數據庫中查找

# app/models/staging/migration.rb 
class Staging::Migration < ActiveRecord::Migration 
    def self.connection 
     ActiveRecord::Base.establish_connection(:staging_db).connection 
    end 
end 

# db/migrate/<timestamp>_create_foo.rb 
class CreateFoo < Staging::Migration 
    .... 
end 

在我的database.yml的staging_db連接配置。

當我運行rake db:migrate時,在staging_db模式中正確創建了表foo,並且在RAILS_ENV = development連接中創建了表schema_migrations。然而分貝:遷移的報告以下錯誤(這失敗的後續遷移):

表「staging_db.schema_migrations」 不存在

有沒有辦法告訴分期::遷移看對於當前RAILS_ENV連接中的schema_migrations表?

順便說一句,我知道staging_db然後不RAILS_ENV意識到的事實。這對我來說很好,因爲每個服務器的環境都是通過單獨的database.yml進行配置的,這不在我的repo中。

回答

0

我已經做了這一點,但軌道以外,它不應該在鐵軌很大的不同,這裏是我如何做到這一點:

的第一件事就是執行您的遷移之前,連接數據庫,在軌最好的地方可能在初始化程序中:

MyModel.establish_connection({ 
    :adapter => "mysql2", 
    :database => "mydb", 
    :username => "root", 
    :encoding => 'utf8' 
}) 

散列通常會從yml文件中加載,但這是您最終想要的結果。
如果您在此數據庫中有多個模型,則MyModel可以是抽象類。

接下來在遷移時要遷移這個數據庫,你只需要做到這一點:

class DoDomething < ActiveRecord::Migration 
    def self.connection 
    MyModel.connection 
    end 

    def self.up 
    add_column [...] 
    end 
end 

有一點要做事這種方式是將只有一個schema_migrations表,並就當注意在「主」數據庫中。

4

你應該嘗試在staging_db第一次遷移之前:

ActiveRecord::Base.connection.initialize_schema_migrations_table 

這將在臨時數據庫創建架構遷移表。如果這不是你想要的,你將不得不操縱一些其他的東西。該schema_migrations_table_name確定哪些表包含遷移版本:

def schema_migrations_table_name 
    Base.table_name_prefix + 'schema_migrations' + Base.table_name_suffix 
end 

所以,如果你有定義它會導致schema_migration_table在分期分貝看起來table_name_prefix。