Membuat multiple database Ruby on Rails

Posted: 11 January 2017 in Programming, Ruby (Ruby On Rails)
Tags: , ,

rubyonrails_shaped.sh-600x6002 tahun berlalu setelah terakhir posting di blog ini. 2 tahun berlalu jg jari mengetik dan mata melihat baris baris kode Ruby serta framework Ruby on Rails. Sekarang ada tugas negara untuk kembali belajar Ruby on Rails ini. Aplikasi yang saya buat mengharuskan untuk membuat database lebih dari satu. Biasanya hal seperti ini digunakan saat kita akan memisahkan suatu keperluan. Sebagai contoh database transaksi kita pisahkan dengan database report dan juga kita pisahkan lagi dengan database log/audit trail.

Setelah mencoba beberapa teknik, berikut sedikit trik untuk membuat konfigurasi multiple database pada Ruby on Rails, dengan fungsi migration juga pada semua konfigurasi.

  1. Buat sebuah file konfig database “.yml” pada folder config, sebagai contoh, disini dibuat file dengan nama “database_a2m.yml” dengan konfigurasi sama dengan file database.yml default bawaan rails.
  2. Buat sebuah file dengan nama “db_a2m.rb” pada folder “config/initializers/”, dan ketikkan baris kode berikut :
    DB_A2M = YAML::load(ERB.new(File.read(Rails.root.join("config","database_a2m.yml"))).result)[Rails.env]
  3. Jika di configuration ruby default terdapat folder “db” di root folder, maka kita menambahkan sebuah folder untuk database baru, sebagai contoh saya menambahkan folder dengan nama “db_a2m”.screen-shot-2017-01-11-at-11-11-20-am
  4. Copy isi direktori db ke folder db_a2m, sehingga struktur direktori app kita sebagai berikut.screen-shot-2017-01-11-at-11-13-26-am
  5. Buat sebuah file dengan nama db_a2m.rake dan letakkan pada folder “lib/tasks/”. Dan ketikkan baris kode berikut pada file tersebut :
    task spec: ["a2m:db:test:prepare"]
    
    namespace :a2m do
    
      namespace :db do |ns|
    
        task :drop do
          Rake::Task["db:drop"].invoke
        end
    
        task :create do
          Rake::Task["db:create"].invoke
        end
    
        task :setup do
          Rake::Task["db:setup"].invoke
        end
    
        task :migrate do
          Rake::Task["db:migrate"].invoke
        end
    
        task :rollback do
          Rake::Task["db:rollback"].invoke
        end
    
        task :seed do
          Rake::Task["db:seed"].invoke
        end
    
        task :version do
          Rake::Task["db:version"].invoke
        end
    
        namespace :schema do
          task :load do
            Rake::Task["db:schema:load"].invoke
          end
    
          task :dump do
            Rake::Task["db:schema:dump"].invoke
          end
        end
    
        namespace :test do
          task :prepare do
            Rake::Task["db:test:prepare"].invoke
          end
        end
    
        # append and prepend proper tasks to all the tasks defined here above
        ns.tasks.each do |task|
          task.enhance ["a2m:set_custom_config"] do
            Rake::Task["a2m:revert_to_original_config"].invoke
          end
        end
      end
    
      task :set_custom_config do
        # save current vars
        @original_config = {
            env_schema: ENV['SCHEMA'],
            config: Rails.application.config.dup
        }
    
        # set config variables for custom database
        ENV['SCHEMA'] = "db_a2m/schema.rb"
        Rails.application.config.paths['db'] = ["db_a2m"]
        Rails.application.config.paths['db/migrate'] = ["db_a2m/migrate"]
        Rails.application.config.paths['db/seeds'] = ["db_a2m/seeds.rb"]
        Rails.application.config.paths['config/database'] = ["config/database_a2m.yml"]
      end
    
      task :revert_to_original_config do
        # reset config variables to original values
        ENV['SCHEMA'] = @original_config[:env_schema]
        Rails.application.config = @original_config[:config]
      end
    end
  6. Untuk menjalankan database migration gunakan perintah berikut : rails a2m:db:migrate
  7. Sesuaikan dengan nama konfigurasi.
  8. Restart server dan sekarang sudah bisa menggunakan konfigurasi multiple database dengan menambahkan baris kode :
    "establish_connection DB_A2M"  pada file model.screen-shot-2017-01-11-at-11-24-06-am

Leave a comment