Chan Myae San Hlaing

Chan Myae San Hlaing

Programmer & Anime Enthusiast

28 Feb 2018

Rails မပါတဲ့ ActiveRecord

Rails မပါတဲ့ ActiveRecord

Cross-posted from Medium.

ကျွန်တော် ခုတလော အလုပ်ရဲ့ လိုအပ်ချက်ကြောင့် PHP တွေရေးနေရတယ်။ ပြောရရင် ကျွန်တော့်ရဲ ပထမဆုံး PHP production app ပဲ။ ဒါပေမဲ့ PHP နဲ့ Laravel ကို အသိုင်းအဝိုင်းကောင်းမှုနဲ့ ရင်းနှီးပြီးသား ဖြစ်နေတော့ ကြီးကြီးမားမား အခက်အခဲတော့ မရှိပါဘူး။

ခက်တာတစ်ခု ကိုယ် Ruby နဲ့ ကျွမ်းဝင် ရင်းနှီးပြီးသားဖြစ်နေတော့ တစ်ချို့ ကိစ္စတွေကို PHP နဲ့ လုပ်ရတာ စိတ်ထင်သလောက် ခရီးမပေါက်ဘူးဖြစ်နေတယ်။ အဲ့ထဲကတစ်ခုကတော့ quick and dirty script လေးတွေရေးရတဲ့ အခါပဲ။ PHP က General Purpose မဟုတ်တော့ တစ်ချို့ ကိစ္စလေး တွေ Automate လုပ်ချင်တယ်ဆိုရင် command line script ထုတ်ရေးရတာ အဆင်မပြေဘူး။

ဒီတစ်ခေါက်ကြုံရတဲ့ တစ်ခုကတော့ Data collection script တစ်ခုရေးဖို့လိုလာတယ်။ ကျွန်တော့် Laravel app ရဲ့ DB ထဲမှာ လိပ်စာတွေကို ကော်လန် တစ်ခုနဲ့ သိမ်းထားတယ်။ ဒါပေမဲ့ အလုပ်လိုအပ်ချက်အရ အဲ့လိပ်စာတွေကို location based search နဲ့ ရှာရတော့မယ်ဆိုတော့ အဲ့လိပ်စာတွေကနေ latitude နဲ့ longitude တွေပြောင်းဖို့လိုလာတယ်။

Table ထဲမှာ Row ကလည်း ရှစ်ထောင်လောက်တော့ရှိမှာဆိုတော့ Manual လိုက်ပြောင်းဖို့ကတော့ မဖြစ်နိုင်ဘူး။ ခေါင်းထဲမှာ ရုတ်တရက်ပေါ်လာတာကတော့ Google Maps API ပဲ။ သူ့ကို သုံးပြီး လိပ်စာကနေ တည်နေရာ လတ်တီကျု၊ လောင်ဂျီကျု ပြောင်းလို့ရတယ်ပေါ့ဗျာ။ အဲ့ဒါ ကို Geocoding ခေါ်တာပေါ့။

ချက်ချင်းပဲ တစ်ချက်ရှာကြည့်လိုက်တော့ ဟုတ်တယ် ခေါ်လို့ရတယ်။ အဆင်သင့် api client gem လေးကလည်းရှိပြီးသား။ အဲ့မှာတင် သူ့ကိုကောက်ပြီး gem install လုပ်ကြည့်လိုက်တယ်။ ပြီးတော့ irb လေးဖွင့် လိုက်စမ်းကြည့်လိုက်တော့ အိုကေပဲ။

Google Maps API key ကလည်းကိုယ့်မှာ ရှိပြီးသားကိုး။ ကျန်တဲ့ ကိစ္စက DB ထဲကလိပ်စာတွေကိုဆွဲထုတ်ပြီး တစ်ခုချင်း Geocode လုပ်ဖို့ပဲ။ အဓိကပြောချင်တဲ့ အကြောင်းအရာက ခုမှ စတယ်။ DB ထဲကထုတ်တော့မယ်ဆိုတဲ့အချိန် ကိုယ်တွေက ActiveRecord ပဲပြေးမြင်တယ်။ ဒါဖြင့် rails မပါပဲနဲ့ သူ့ချည်းသက်သက် ActiveRecord ကြီးကို ဘယ်လိုသုံးမတုံးဆိုတော့ လွယ်ချက်ပဲ။ အောက် ကကုတ်လေးပဲလိုတယ်။

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
require "active_record"

ActiveRecord::Base.establish_connection(
  :adapter => 'mysql2',
  :database => 'mydb',
  :username => 'myuser',
  :password => 'mypass',
  :host => 'localhost'
)

class VetClinic < ActiveRecord::Base
end

ကျွန်တော့်မှာ mydbဆိုတဲ့ database ထဲမှာ vet_clinics ဆိုတဲ့ table ရှိတယ်ဗျာ။ အဲ့တော့ အဲ့ဒီ database ကို connection ချိတ်ပြီး rails convention အတိုင်း Table name ကို Model name ပြောင်းလိုက်တာနဲ့ တစ်ခါထဲ rails ထဲမှာလို VetClinic.new VetClinic.all အကုန်သုံးလို့ ရသွားတယ်။ Migration တောင်မလိုဘူးဗျ။ Convention Over Configuration ရဲ့အစွမ်းတွေပေါ့။ ဘယ် field ကဘယ်လိုဘာညာ Mapping ချိတ်စရာကိုမလိုတာ။ တစ်ခုတော့ရှိတာပေါ့ဗျာ မရှိတဲ့ field သွားခေါ်ရင်တော့ error တက်မှာပေါ့။

ကျန်တာကတော့ ထုံးစံအတိုင်း လိုချင်တဲ့ Record လေးတွေ Loop ပတ် Google Maps API client လေးနဲ့ Geocode လုပ်ပြီး table ထဲက lat နဲ့ lng column တွေထဲ ပြန်ထည့်လိုက်တာပေ့ါလေ။

Google Maps API limit (တစ်နေ့၂၅၀၀ ပဲခေါ်ခွင့်ရှိ) ကြောင့် paginate လုပ်သုံးရက်လောက်ခွဲ run ရတာတို့ command line argument တွေပေးပြီး reusable script ဖြစ်အောင်လုပ်တာတို့ backup အနေနဲ့ JSON file ထဲထည့်သိမ်းတာတို့တော့ မရေးတော့ပါဘူး။ ပျင်းလို့ ဟီး။

တကယ်တော့ PHP နဲ့ Laravel မှာလည်း အဲ့တာအကုန်လုပ်လို့ရပါတယ်လေ။ command line က run လို့ exception တက်ရင် လိုင်းနံပါတ်မသိတာတို့ JSON file ဘယ်လို ရေးရမလဲခေါင်းစားတာတို့ composer package ကို Laravel အပြင်မှာ သွင်းရင် ဘယ်လို သွင်းရမလဲတို့ မသိတာတွေကများနေတော့ ကိုယ်သိတဲ့ ruby နဲ့ ပဲ ရေးဖြစ်သွားတယ်။ အဲ့ဒါနဲ့ ပဲ ဒီတစ်သက် PHP ကောင်းကောင်းတတ်ပါ့အုံးမလားမသိ။