Как настроить дополнительную / другую папку миграции - PullRequest
17 голосов
/ 08 октября 2010

Мы с коллегой работаем над разными проектами, в которых используются некоторые модели.Итак, мы делимся моделями через подмодуль git.

Кроме того, мы хотели бы иметь возможность также обмениваться миграциями:

Таким образом, миграции моего коллеги будут в папкеdb/migrate/other_db моего проекта.

Как настроить миграцию rails для запуска миграций в этой дополнительной папке?

Ответы [ 6 ]

28 голосов
/ 09 мая 2012

В вашем конфигурационном файле (config / application.rb для всех сред или config / environment / $ (environment) .rb только для конкретной среды) добавьте эту строку:

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

И если вы хотитеизменить путь по умолчанию 'db / migrate' (config.paths ['db / migrate'] - это массив с одной строкой 'db / migrate' по умолчанию), сделать это:

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

Вот настройки по умолчанию.paths, которые мы также можем изменить:

"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"],
4 голосов
/ 11 октября 2010

основываясь на ответе Swanand, мы можем написать миграцию для загрузки миграций во внешний каталог:

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
3 голосов
/ 06 ноября 2014

Кстати, если вы создаете драгоценный камень для работы с Rails, вы можете поместить блок, подобный следующему, в свою железнодорожную связь, чтобы добавить собственные миграции драгоценного камня.

  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

Нет необходимости копировать миграции из вашего драгоценного камня с генераторами, если вы используете эту технику.

Вы можете создать метод для получения корневого каталога вашего драгоценного камня с помощью чего-то вроде этого ...

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

  module_method :root
end

... в файле lib / my_gem_name.rb в вашем камне,

2 голосов
/ 29 января 2019

Обновление для Rails 5/6;

Rails 5 рекомендует установить дополнительные пути миграции в вашем файле config/database.yml. Это очень просто, посмотрите этот пример;

development:
  migrations_paths:
  - "db/migrate/other_db"
  - "db/migrate/something_else"

ActiveRecord::Migrator.migrations_path= будет устаревшим в Rails 6.

2 голосов
/ 08 октября 2010

Я не знаю очень чистого способа сделать это, но код, выполняющий миграцию, выглядит примерно так:

@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 

Где,

@migrations_path = 'db/migrate'

Так что если вы изменитеЭто вместо того, чтобы читать из файла конфигурации, это может сработать в вашу пользу.Но, как я уже сказал, это определенно не очень чистый способ сделать это.

1 голос
/ 13 июня 2017

Просто добавьте этот инициализатор в ваш 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...