s2daoみたいな、.sqlファイルを読み込んで実行する処理を書いてみました

sqlファイルを外部ファイルかしたいとか
sql文中にif文を入れたいとか
・in句に配列を設定したいとか
s2daoみたいなことをするクラスを作ってみました

ディレクトリ構造


app
/models
/searchsql.rb(空のmodel)
lib
/sql
/.sqlファイルを格納する
/util
/custom_sql.rbsql
クラス本体

#==========================================
# custom_sql.rb
#
# ▼method
# execute_query(sql_name,params)
#
# ▼params
# {:login_id => "test", :name => "name", :user_status => [2,3,4]}
#
# ▼sql_name
# sqlファイルの名称
#
# ▼sqlファイルの書式
# ・sql
# sqlの構文に従って記述する
#
# ・if,end
# /*とif,endの間は、半角スペースを1個挟む
# /* if !params[:login_id].blank? */
#
# ・parameter
# /*とparameterは連続して記述する
# -単独
# /*[:login_id]*/
# -配列
# /*:login_id*/
#
# ▼sqlファイル例
# -------------------------------
# sample.sql
# select
# *
# from
# system_users
# where
# 1 = 1
# /* if [:login_id] != nil && ![:login_id].empty? */
# and login_id = /*[:login_id]*/"test"
# /* end */
# /* if [:name] != nil && ![:name].empty? */
# and name = /*[:name]*/
# /* end */
# and user_status in (/*:user_status*/"2,3,4")
# and member_code in (/*:member_code*/)
# -------------------------------
#
#==========================================
class Sql

# 正規表現定義
RegIf = /\/\*\sif(.*?)\*\//
RegEnd = /\/\*\send\s\*\//
RegPrm1 = /\/\*\[:(.*)\]\*\/".*"/
RegPrm2 = /\/\*\[:(.*)\]\*\//
RegArr1 = /\/\*\[\[:(.*)\]\]\*\/".*"/
RegArr2 = /\/\*\[\[:(.*)\]\]\*\//

#===============================
# SQLの実行
#===============================
def self.execute_query(sql_name, params)
q, p = make_query(sql_name, params)
Searchsql.find_by_sql([q, p])
end

#===============================
# SQLクエリ、パラメータの作成
#===============================
def self.make_query(sql_name,params)
# file名,pathの設定
sql_name = sql_name + '.sql'
path = File.expand_path(sql_name,'lib/sql')

# ローカル変数の初期化
q, p, ctr_flg = [], {}, true

# query,paramsの作成
File.open(path,'r'){|f|
f.each{|row|
if RegIf =~ row
ctr_flg = eval_cond(ctr_flg,$1,params)
elsif RegEnd =~ row
ctr_flg = true
elsif ctr_flg
if RegPrm1 =~ row
q << row.sub(RegPrm1,':' + $1.to_s)
p[$1.to_sym] = params[$1.to_sym]
elsif RegPrm2 =~ row
q << row.sub(RegPrm2,':' + $1.to_s)
p[$1.to_sym] = params[$1.to_sym]
elsif RegArr1 =~ row
q << row.sub(RegArr1,':' + $1.to_s)
p[$1.to_sym] = params[$1.to_sym].join(',')
elsif RegArr2 =~ row
q << row.sub(RegArr2,':' + $1.to_s)
p[$1.to_sym] = params[$1.to_sym].join(',')
else
q << row
end
end
}
}
return q.to_s, p
end

#===============================
# クエリ取得用
# sqlfileの名称からstringのクエリを取得する
#===============================
def self.query(sql_name)
q, p = make_query(sqlname,nil)
return q
end

private
#===============================
# SQL内の条件節の評価処理
#===============================
def self.eval_cond(flg, condcd, params)
cd = 'flg = ' + condcd
eval(cd)
return flg
end

end

いかんせん急拵えなので
作りは納得できていないのですが
まあうごきます。。