Ruby On Rails in UA Icon_home Главная Add to bookmarks Translate translate Profile Войти
Регистрация Форум Блоги Пользователи Ресурсы Список джемов      Поиск   
Arrow_leftНазад в блог

Миграции при конекте к нескольким базам

Date2008-08-29 UserRuslan Voloshin Commentкоментарии 0

При использовании двух быз данный конфиг ко второй был описан в пердыдущем посте появляется задача в миграциях и тестах.

В качестве выходя из данной ситуации было решено для тестов сваливать все таблицы в одну базу так  проще разрабатывать  и тестить. По этому был переписан всего один рейк так который будет дампить две базы в один файл schema.rb

lib/tasks/db_migrations.rake

namespace :db do
  namespace :schema do
    desc "Create a db/schema.rb file that can be portably used against any DB supported by AR"
    task :dump => :environment do
      require 'active_record/schema_dumper'
      File.open(ENV['SCHEMA'] || "db/schema.rb", "w") do |file|
        ActiveRecord::SchemaDumper.dump([ActiveRecord::Base.connection, MarketingDb.connection], file)
      end
    end
  end
end

для напоминания приведу еще раз models/marketing_db.rb

class MarketingDb < ActiveRecord::Base
  self.abstract_class = true
  establish_connection("marketing_db_#{RAILS_ENV}".to_sym) unless RAILS_ENV.eql?('test')
end

Добавляем в application.rb загрузку нашей библиотеки которая переопределает ActiveRecord::SchemaDumper.dump 

require 'multi_db' #rake task for dump 2 databases

-----------------------------

#file lib/multi_db.rb

module ActiveRecord
  class SchemaDumper
#Create dump.rb for many databases
    def self.dump(array_connects, stream=STDOUT)
      array_connects = array_connects || ActiveRecord::Base.connection
      if array_connects.is_a?(Array)
        array_connects.each { |connect|
          new(connect).dump(stream, connect.eql?(array_connects.first), connect.eql?(array_connects.last))
        }
      else     
        new(array_connects).dump(stream)
      end
      stream
    end
   
    def dump(stream, is_header = false, is_footer = false)
      header(stream) if is_header
      tables(stream)
      trailer(stream) if is_footer
      stream
    end

  end
end

   

#и немного доопределим что бы миграции нормально проходили и переключались между базами в этом же файле lib/multi_db.rb

module ActiveRecord
  class Migration
   
    def self.use_db(db_name)
      ActiveRecord::Base.establish_connection("#{db_name}_#{RAILS_ENV}".to_sym)
    end

    def self.restore_connection
      ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
    end
  end
end

и теперь дошли до самого файла миграции

class CreateMdbProducts < ActiveRecord::Migration
 
  def self.up
    use_db('marketing_db')

    create_table :mdb_products do |t|
      t.string :description, :null => false
      t.timestamps
    end
   
    restore_connection
  end

  def self.down
    use_db('marketing_db')

    drop_table :mdb_products
   
    restore_connection
  end
end


0 коментариев
Новый коментарий
зарегистрируйтесь для добавления сообщений
используй формат RedCloth
Ключевые слова:
Гости: 221 Онлайн: Junior,
Rambler's Top100
О проекте по всем вопросам обращайтесь на support
Rubyclub.com.ua Copyright © 2007 - 2008