Archive for the ‘Programming’ Category

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

rubyonrails_shaped.sh-600x600Disaat kita membuat sebuat aplikasi yang besar, kompleks, banyak menu dan atau modul, akan sangat menyusahkan jika dalam meletakkan model-view-controller kita default sesuai dengan standard framework yang kita gunakan.

Dalam kasus ini yakni ruby on rails, secara default meletakkan file model-view-controller pada folder app/.

Custom sederhana pada path rails akan lebih mudah dalam pengkelompokan modul modul (modular) atau seperti HMVC (Hierarchial Model View Controller), namun hanya perlu config sederhana, tanpa perli menambahkan sebuah class third party. Config nya hanya seperti ini Om.

  1. Buat sebuah folder dengan nama modules di dalam direktori app/. *nama folder bisa disesuaikan.
  2. Config di bagian config/application.rb dan tambahkan kode baris berikut untuk bisa load path controller dan view pada folder app/modules/. 
    config.autoload_paths += Dir["#{config.root}/app/modules/**/**/**/"]
    
  3. Kemudian untuk load path view edit file app/controllers/application_controller.rb  ,dan tambahkan baris berikut :

    before_filter :set_view_path
    def set_view_path
       prepend_view_path Dir["#{Rails.root}/app/modules/**/**"]
    end
    
  4. Dan selanjutnya struktur mvc nya sebagai berikut :

    ss_hmvc_rails

    struktur modular

  5. Pindahkan file models, views dan controllers ke dalam folder modules.

Kali ini langkah langkah membuat modular ruby on rails ini saya diajarin dengan orang yang namanya Mas Udin. Demikian konfigurasi sederhana yang bisa diterapkan dalam framework ruby on rails, semoga bermanfaat.

oracle_database_logoDalam membuat suatu aplikasi, web khususnya, atau bisa juga desktop, biasanya kita menggunakan menu bertingkat (tree view) untuk mengkelompokkan modul, atau untuk menghemat space pada menubar. Untuk membuat tree menu bertingkat dinamis, digunakanlah perulangan untuk menampilkan menu tersebut dengan mengambil data dari database atau biasa dikenal dengan fungsi rekursif. Apa itu fungsi rekursif?, tinggal dibalik aja : Fungsi rekursif adalah sebuah fungsi yang memanggil dirinya sendiri di dalam fungsi tersebut.

Gampangnya begini Om, didalam menu itu ada menu lagi, nah jika data-data menu tersebut disimpan dalam database, maka biasanya (saya) digunakan fungsi rekursif itu untuk menyelesaikannya. Ini nih om contoh tree menu.

tree-menu

contoh tree menu

Contoh fungsi rekursif di PHP (Code Igniter) begini salah satunya (maap screenshoot nya gak komplit) :

ss_rekursif

fungsi rekursif

Fungsi seperti ini yang biasanya digunakan untuk membuat tree menu, dulu yang ngajarin saya beginian namanya Om Welly, Om Lambang dkk. Tapi maap gak komplit contoh fungsi rekursif nya, karena yg kita bahas sekarang bukan membuat rekursif menu menggunakan fungsi seperti ini, tapi langsung menggunakan Queries Oracle.

Sumber dasar dokumentasi nya dari sini Om kalau mau lihat lengkap nya : http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm

Contoh Query nya begini :

SELECT last_name, employee_id, manager_id, LEVEL
      FROM employees
      START WITH employee_id = 100
      CONNECT BY PRIOR employee_id = manager_id
      ORDER SIBLINGS BY last_name;

Hasilnya akan seperti ini Om:

LAST_NAME                 EMPLOYEE_ID MANAGER_ID      LEVEL
------------------------- ----------- ---------- ----------
King                              100                     1
Cambrault                         148        100          2
Bates                             172        148          3
Bloom                             169        148          3
Fox                               170        148          3
Kumar                             173        148          3
Ozer                              168        148          3
Smith                             171        148          3
De Haan                           102        100          2
Hunold                            103        102          3
Austin                            105        103          4
Ernst                             104        103          4
Lorentz                           107        103          4
Pataballa                         106        103          4
Errazuriz                         147        100          2
Ande                              166        147          3
Banda                             167        147          3
...

Kurang lebih begitu Om, menu otomatis tersusun secara tree sesuai dengan parent nya. Nanti langsung menggunakan perulangan di view nya. Dan query ini bisa digunakan untuk memanggil data yang bersifat hierarchial seperti struktur organisasi dan lain sebagainya.  Semoga  bermanfaat.