Multiple Database connection on Rails
Posted by batt | Posted in RubyOnRails | Posted on 18-05-2009
0
เกิ่นนำซักเล็กน้อยแล้วกัน…
ทำงานใช้ ROR มาได้ซักพัก ได้ทำ Project GSMIS ของบัณฑิตวิทยาลัย มหาวิทยาลัยขอนแก่น
โอ้ววว…!!!!!!!! เจออะไรที่ต้อง research เยอะมาก
เรื่องแรกเลย…ฐานข้อมูลเราไม่มีข้อมูลที่เก็บไว้เอง ต้อง import
ก่อนหน้านี้ Project นี้ผ่านมือพี่คนอื่นมาก่อนก่อนจะมาถึงเรา
ตอนนั้น…ทุกคนยังใหม่กับ ROR เลยใช้วิธี import จาก Excel ได้ผลดีในระดับ
มีข้อเสียคือเปลืองเวลาคนมานั่ง upload file
และแล้ว GSMIS ก็ได้เริ่มนับหนึ่งใหม่อีกครั้ง ทำให้ได้ทำ research เรื่องแรก คือ
“Multiple Database connection on Rails”
หลังจากเขียนน้ำมาเยอะ มาจริงจักกันได้แล้ว
ถ้าเราจำเป็นต้องใช้ Database มากกว่า 1 ตัว ใน 1 Project
ขั้นแรก…แก้ config ที่ไฟล์ config/database.yml
ก่อนแก้ config/database.yml
# Default defaults: &defaults adapter: postgresql encoding: unicode host: localhost database: databasename username: username password: password development: <<: *defaults test: <<: *defaults production: <<: *defaults
ตามข้างบน ก็จะเป็นปกติที่เราใช้ๆ กัน คือ connect ไปที่ database เดียว ต่อไปจะเป็น code หลังจากแก้ไข
แก้ไขแล้ว config/database.yml
# Default defaults: &defaults adapter: postgresql encoding: unicode host: localhost database: databasename username: username password: password development: <<: *defaults test: <<: *defaults production: <<: *defaults # Database ที่ N default_Ns: &default_Ns adapter: postgresql encoding: unicode host: localhost database: databasename_N username: username_N password: password_N prefixN_development: <<: *default_Ns prefixN_test: <<: *default_Ns prefixN_production: <<: *default_Ns
พอแก้ไข config/database.yml แล้ว ยังไม่สามารถใช้ได้ ยังต้องไปแก้อีกไฟล์
เอ้ยยย..ไม่สิ เรียกว่า เขียน code เพิ่มดีกว่า
ไฟล์ที่จะไปเขียน code เพิ่มก็คือ … ไฟล์ controller ไหนก็ได้
แต่จะพาเขียนไว้ที่ app/controllers/application.rb (คงรู้นะว่าทำไม ถึงเขียนไว้ที่นี่)
class ApplicationController < ActionController::Base before_filter :set_N_db_connection def set_N_db_connection # extra_coord = YAML.load(File.open(File.join(RAILS_ROOT, PATH_FILE_CONFIG),"r"))[PREFIX_CONNECTION+ ENV['RAILS_ENV']] extra_coord = YAML.load(File.open(File.join(RAILS_ROOT,"config/database.yml"),"r"))[,"prefixN_"+ ENV['RAILS_ENV']] # MODEL_CLASS_NAME.establish_connection(extra_coord) TableName.establish_connection(extra_coord) end end
TableName คืออะไร มันก็คือ class name ของ model นั่นเอง
เพราะฉะนั้น เราก็ต้องมี model TableName (app/model/table_name.rb) ด้วย
เท่านี้ก็เรียบร้อย

