SIDEBAR
»
S
I
D
E
B
A
R
«
Multiple Database connection on Rails
May 18th, 2009 by batt

เกิ่นนำซักเล็กน้อยแล้วกัน…

ทำงานใช้ 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) ด้วย

เท่านี้ก็เรียบร้อย

SIDEBAR
»
S
I
D
E
B
A
R
«
»  Substance:WordPress   »  Style:Ahren Ahimsa