2010-10-08 25 views
14

Un collègue et moi travaillons sur différents projets qui partagent certains modèles. Donc, nous partageons les modèles à travers un sous-module git.Comment configurer un dossier de migration supplémentaire/différent

De plus, nous aimerions pouvoir partager aussi les migrations:

De cette façon, serait de mon collègue migrations dans le dossier db/migrate/other_db de mon projet.

Comment puis-je configurer les migrations de rails pour exécuter également les migrations dans ce dossier supplémentaire?

Répondre

26

Dans votre fichier de configuration (config/application.rb pour tous les environnements ou config/environnements/$ (environnement) .rb seulement pour l'environnement en particulier) ajouter cette ligne:

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

Et si vous voulez changer chemin par défaut 'db/migrate' (config.paths [ 'db/migration'] est un tableau avec une chaîne 'db/migrate' par défaut), faites ceci:

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

Voici config.paths par défaut, que nous pouvons également changer:

"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

Rails 4: 'config.paths [ 'db/migration'] << « db/migration/other_db'' – Kris

+7

Le bon answer est 'config.paths ['db/migrate'] << 'db/migrate/other_db'' pour Rails 3 ou 4. – pisaruk

+1

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

2

Je ne sais pas d'une façon très propre de le faire, mais le code qui va migrations ressemble à quelque chose comme:

@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 

Où,

@migrations_path = 'db/migrate' 

Donc, si vous modifiez ce à lire à partir du fichier de configuration à la place, il peut fonctionner en votre faveur. Mais comme je l'ai dit, ce n'est certainement pas une façon très propre de le faire.

3

basé sur la réponse par Swanand, nous pouvons écrire une migration pour charger les migrations dans un répertoire externe:

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

Par ailleurs, si vous construisez un petit bijou à travailler avec Rails, vous pouvez placer un bloc comme suit dans votre traverse de rail pour ajouter les propres migrations de la gemme.

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 

Il n'y a pas besoin de copier les migrations de votre bijou avec des générateurs si vous utilisez cette technique.

Vous pouvez faire une méthode pour obtenir le répertoire racine de votre bijou avec quelque chose comme ça ...

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

    module_method :root 
end 

... dans le fichier lib/my_gem_name.rb dans votre bijou.

0

ajoutez juste initialiseur à votre 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