ActiveRecord in pure Ruby(+ API server)


#1

這篇有點重要,主要讓新手可以脫離 Rails 的魔掌…用類似 sinatra 的方式來寫 API server

首先,你要裝好 Rails 或是單純裝 ActiveRecord,之後就可以類似這樣玩(可在irb下嘗試)

require 'active_record'
#require 'yaml'   #如果要讀yml就要開

#初始化
#A.去讀Rails的database.yml
#database_config_file_path = '../config/database.yml'
#ActiveRecord::Base.establish_connection(YAML.load_file("#{__dir__}/#{database_config_file_path}")["development"])

#B.一般使用,如同database yaml檔的設定,請改成你家的設定
ActiveRecord::Base.establish_connection({
  adapter: 'mysql2',
  encoding: 'utf8',
  database: 'tester',
  username: 'imroot',
  password: 'imroot'
})

#宣告要用的model
class User < ActiveRecord::Base ; end

#開始使用
User.count #=> n

這樣就可以在不使用 Rails 的狀況下用 ActiveRecord 當 DB 的 ORM 介接,就可以完全甩掉 Rails 這個龐然大物,之後是弄在 sinatra 上的基本 demo code,非常類似上面


新增檔案:sinatra_server.rb

##上半部 demo code 同上,請 copy 過來貼上

require 'sinatra'
require 'json'

get '/' do
  return User.count.to_s
end
get '/show/:id' do
  content_type :json

  user = User.where(:id => params[:id]).first
  return {:ans => 'no user'}.to_json unless user
  return user.attributes.to_json
end

之後使用類似的指令

ruby sinatra_server.rb -o 0.0.0.0

增加-o是讓外部的IP也可以連進來,之後你就可以打開你的瀏覽器,類似

http://127.0.0.1:4567/
http://127.0.0.1:4567/show/1  #1 = 你家user的id

就可以看到成果了,一般簡易的 http API server 大概就這樣就好,因為 rack 層很少,所以效能遠遠超過 Rails 的負載之類的,anyway用這樣的方式就可以用 pure ruby 的方式來寫一個屬於自己的 API server,而 sinatra 就亂開網址有的沒的…簡單且方便且乾淨的啦 :slight_smile:

sinatra 還有很多好用的方式,類似你想用 erb 來做 view,或是類似 controller 的 before_action / after_action 都是可以做到的就是,詳情請參閱 sinatra 的官方 doc,以上


一般的資料庫架構有辦法利用Ruby架設RESTful API嗎?
Ruby as service
操作資料庫問題
純ruby上的activerecord如何使用?
Grape 搭配 Swagger 一直吐404
Nokogiri 問題求救
dbh.do 使用? 問題
新手求救,下載檔案問題求救
#2

在這邊若怕被打爆,也是用Redis去處理嗎?


#3

再快的語言都會寫出爛產品,應該要看實際需求而定,否則用Redis還是一樣死的


#4

ActiveRecord::Base.establish_connection裡面
是不是

  adapter: 'mysql2'
  encoding: 'utf8'
  database: 'tester'
  username: 'imroot'
  password: 'imroot'

都要用逗點隔開?


#5

問一個我不知道算不算問題的事情,
原本我的資料庫table叫做Game
會出現這個錯誤

Mysql2::Error: Table 'for_sina.games' doesn't exist: SHOW FULL FIELDS FROM `games`

table 改成 games 就可以跑了
所以要把所有資料庫的名稱都改成符合 rails 習慣寫法的那樣
table都改成小寫然後複數結尾嗎?


#6

逗點改了,感謝,and ActiveRecord 的 table_name 預設是 model name 的覆數型態,而你可以用以下

class Mouse < ActiveRecord::Base
  set_table_name "mice"
end

doc : http://apidock.com/rails/ActiveRecord/Base/table_name/class

約定大於設定,你還是可以設定,而非只有約定,以上


#7

玩範例撞牆,求救 orz

想做的事:直接連某個現存 project 的資料庫,抓那個資料庫的東西出來

我開 pry 然後初始化選用 A 方法(直接連某個 rails project 的 database.yml),然後宣告 User model,接著下 User.count。結果噴了錯誤訊息:

ActiveRecord::ConnectionTimeoutError: could not obtain a connection from the pool within 5.000 seconds (waited 5.005 seconds); all pooled connections were in use ...

感覺 User.count 應該很簡單,不吃什麼資源,所以猜是沒連到造成逾時,但跑 ActiveRecord::Base.establish… 有回傳那個資料庫的訊息…

後來去那個專案底下開 rails c,下 User.count 有得到預期的使用者數。大大們有看出什麼問題嗎 :frowning: :crazy_face: :cry:


#8

… 『我開 pry 然後初始化選用 A 方法(直接連某個 rails project 的 database.yml)』

DB pool 會在 pry ( rails_pry ) init 後就會有,所以沒有那種 init 後才改的哩,因為 pool 不會重建?