2010-10-08 11 views
14

Współpracownik i ja pracujemy w różnych projektach, które mają wspólne modele. Dzielimy się modelami za pomocą modułu submodule git.Jak skonfigurować folder dodatkowych/różnych migracji

Dodatkowo chcielibyśmy, aby móc dzielić się również migracje:

w ten sposób, migracje mój kolega byłby w folderze db/migrate/other_db mojego projektu.

Jak skonfigurować migracje rails w celu uruchamiania migracji w tym dodatkowym folderze?

Odpowiedz

26

w pliku konfiguracyjnym (config/environment.rb dla wszystkich środowiskach lub config/środowiskach/$ (środowisko) .rb tylko dla konkretnego środowiska) dodaj ten wiersz:

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

A jeśli chcesz zmienić domyślne 'db/migrate' ścieżkę (config.paths [ 'db/migrować'] jest tablicą z jeden ciąg "db/migrate" domyślnie), zrób to:

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

Oto domyślne config.paths, które również mogą zmienić:

"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

W Rails 4: 'config.paths [ 'db/migrować'] <<„db/migrować/other_db'' – Kris

+7

Poprawna odpowiedzią jest 'config.paths ['db/migrate'] << 'db/migrate/other_db'' dla Rails 3 lub 4. – pisaruk

+1

' config.paths [' db/migrate '] + = [' db/migrate/other_db "] też by działało. –

2

Nie wiem, z bardzo czystą sposób to zrobić, ale kod, który działa migracje wygląda mniej więcej tak:

@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 

Gdzie,

@migrations_path = 'db/migrate' 

więc jeśli to zmienić, aby przeczytać z pliku konfiguracyjnego może to działać na twoją korzyść. Ale jak powiedziałem, zdecydowanie nie jest to bardzo czysty sposób na zrobienie tego.

3

na podstawie odpowiedzi przez Swanand, możemy napisać migrację załadować migracje w zewnętrznym reż:

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

Nawiasem mówiąc, jeśli budujesz gem do pracy z Rails, można umieścić blok jak poniżej w swój krawat kolejowy, aby dodać własne migracje klejnotu.

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 

Nie ma potrzeby kopiowania migracji z gem za pomocą generatorów, jeśli używa się tej techniki.

Można zrobić metodę, uzyskując katalogu głównym gem z jakiejś rzeczy jak ta ...

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

    module_method :root 
end 

... w pliku lib/my_gem_name.rb w swojej gem.

0

Wystarczy dodać ten inicjator do 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