2010-10-08 12 views
14

Un colega y yo estamos trabajando en diferentes proyectos que comparten algunos modelos. Entonces, estamos compartiendo los modelos a través de un submódulo de git.Cómo configurar una carpeta de migraciones extra/diferente

Además, nos gustaría poder compartir también las migraciones:

De esta manera, las migraciones de mi colega estarían en la carpeta db/migrate/other_db de mi proyecto.

¿Cómo puedo configurar las migraciones de los raíles para que también ejecuten las migraciones en esta carpeta adicional?

Respuesta

26

En el archivo de configuración (config/application.rb para todos los entornos o ambientes config// $ (medio ambiente) .RB particular, sólo para el medio ambiente) añadir esta línea:

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

Y si desea cambiar por defecto '/ db emigran' ruta (config.paths [ 'db/migrar'] es una matriz con una cadena 'db/migrate' de forma predeterminada), haga esto:

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

Éstos son config.paths predeterminados, que también podemos cambiar:

"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

En Rails 4: 'config.paths [ 'db/migrar'] << 'db/migrar/other_db'' – Kris

+7

La correcta la respuesta es 'config.paths ['db/migrate'] << 'db/migrate/other_db'' para Rails 3 o 4. – pisaruk

+1

' config.paths [' db/migrate '] + = [' db/migrate/other_db '] 'también funcionaría. –

2

No sé de una manera muy limpia de hacerlo, pero el código que se ejecuta migraciones se ve algo como:

@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 

Cuando,

@migrations_path = 'db/migrate' 

Así que si cambia esto para leer desde el archivo de configuración en su lugar, puede funcionar a su favor. Pero como dije, definitivamente esta no es una manera muy limpia de hacerlo.

3

basado en la respuesta por Swanand, podemos escribir una migración a cargar las migraciones en un directorio externo:

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

Por cierto, si usted está construyendo una joya para trabajar con rieles, se puede colocar un bloque como el siguiente en su atadura de carril para agregar las propias migraciones de la gema.

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 

No es necesario copiar migraciones de su gema con generadores si utiliza esta técnica.

Puede realizar un método para producir el directorio raíz de la joya con algo como esto ...

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

    module_method :root 
end 

... en el archivo lib/my_gem_name.rb en su joya.

0

Sólo tiene que añadir esto a su inicializador 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 
Cuestiones relacionadas