2010-10-08 10 views
14

Un collega e io stiamo lavorando a diversi progetti che condividono alcuni modelli. Quindi, stiamo condividendo i modelli attraverso un sottomodulo git.Come configurare una cartella di migrazione extra/differente

Inoltre, vorremmo essere in grado di condividere anche le migrazioni:

In questo modo, le migrazioni del mio collega sarebbe nella cartella db/migrate/other_db del mio progetto.

Come è possibile configurare le migrazioni dei binari per eseguire anche le migrazioni in questa cartella aggiuntiva?

risposta

26

nel file di configurazione (config/application.rb per tutti gli ambienti o config/ambienti/$ (ambiente) .RB solo per particolare ambiente) aggiungere questa riga:

config.paths['db/migrate'] += 'db/migrate/other_db' 

E se si desidera modificare default 'db/migrate' percorso (config.paths [ 'db/migrate'] è un array con una stringa 'db/migrate' di default), fare questo:

config.paths['db/migrate'] = ['db/my_migrate'] 

Ecco config.paths di default, che possiamo anche cambiare:

"app" => ["app"], 
"app/assets" => ["app/assets"], 
"app/controllers" => ["app/controllers"], 
"app/helpers" => ["app/helpers"], 
"app/models" => ["app/models"], 
"app/mailers" => ["app/mailers"], 
"app/views" => ["app/views"], 
"lib" => ["lib"], 
"lib/assets" => ["lib/assets"], 
"lib/tasks" => ["lib/tasks"], 
"config" => ["config"], 
"config/environments" => ["config/environments"], 
"config/initializers" => ["config/initializers"], 
"config/locales" => ["config/locales"], 
"config/routes" => ["config/routes.rb"], 
"db" => ["db"], 
"db/migrate" => ["db/migrate"], 
"db/seeds" => ["db/seeds.rb"], 
"vendor" => ["vendor"], 
"vendor/assets" => ["vendor/assets"], 
"vendor/plugins" => ["vendor/plugins"], 
"config/database" => ["config/database.yml"], 
"config/environment" => ["config/environment.rb"], 
"lib/templates" => ["lib/templates"], 
"log" => ["log/development.log"], 
"public" => ["public"], 
"public/javascripts" => ["public/javascripts"], 
"public/stylesheets" => ["public/stylesheets"], 
"tmp" => ["tmp"], 
+3

In Rails 4: 'config.paths [ 'db/migrate'] << 'db/migrate/other_db'' – Kris

+7

la correttezza risposta è 'config.paths ['db/migrate'] << 'db/migrate/other_db'' per Rails 3 o 4. – pisaruk

+1

' config.paths [' db/migrate '] + = [' db/migrate/other_db '] 'funzionerebbe anche. –

2

Non so di un modo molto pulito per farlo, ma il codice che gestisce le migrazioni sembra qualcosa di simile:

@migrations ||= begin                                    
     files = Dir["#{@migrations_path}/[0-9]*_*.rb"]                             

     migrations = files.inject([]) do |klasses, file|                            
      version, name = file.scan(/([0-9]+)_([_a-z0-9]*).rb/).first 

Dove,

@migrations_path = 'db/migrate' 

Quindi, se si modifica questa a leggere dal file di configurazione, potrebbe funzionare a tuo favore. Ma come ho detto, questo non è sicuramente un modo molto pulito per farlo.

3

in base alla risposta da Swanand, possiamo scrivere una migrazione per caricare le migrazioni in una directory esterna:

class MigrateMetadata < ActiveRecord::Migration 
    MIGRATIONS_PATH='db/migrate/metadata' 
    def self.up 
    Dir["#{MIGRATIONS_PATH}/[0-9]*_*.rb"]. 
    sort.map{|filename|require filename}.flatten. 
    each{|class_name| const_get(class_name).up} 
    end 

    def self.down 
    Dir["#{MIGRATIONS_PATH}/[0-9]*_*.rb"].sort.reverse. 
    map{|filename|require filename}.flatten. 
    each{|class_name| const_get(class_name).down} 
    end 
end 
2

A proposito, se si sta costruendo una gemma di lavorare con Rails, è possibile inserire un blocco come il seguente in il tuo legame ferroviario per aggiungere le migrazioni della gemma.

root = ... # the path to your gem 
    initializer :append_migrations do |app| 
    unless app.root.to_s.match root 
     app.config.paths["db/migrate"] << File.join(root, 'db/migrate') 
    end 
    end 

Non è necessario copiare le migrazioni dalla gemma con i generatori se si utilizza questa tecnica.

È possibile effettuare un metodo per produrre la directory principale del gioiello con qualche cosa come questa ...

module MyGemName 
    def root 
    File.expand_path '../..', __FILE__ 
    end 

    module_method :root 
end 

... nel file lib/my_gem_name.rb nel vostro gioiello.

0

Basta aggiungere questo initializer al tuo lib/engine.rb:

initializer 'your_engine_name.migrations' do |app| 
    config.paths['db/migrate'].expanded.each do |expanded_path| 
    app.config.paths['db/migrate'] << expanded_path 
    ActiveRecord::Migrator.migrations_paths << expanded_path 

    if Rake.application.top_level_tasks.empty? 
     ActiveRecord::Migration.check_pending! if ActiveRecord::Migrator.needs_migration? 
    end 
    end 

end 
Problemi correlati