RubyOnRailsでfindする時、conditionsにArrayを渡すメモ
RubyOnRailsでfindするSQLを組み立てる際、複数の自動生成されるキーをconditionsに渡そうとして詰まったのでメモ書き。
最終的に作りたいfind文は以下。
User.find( :all, conditions => [ 'id IN ( ?, ?, ?, ?, ? )', 2, 4, 5, 8, 9 ] )
ユーザからのリクエストで、以下のようなid郡を配列で受けてます。
idは実際は特殊なもので、エスケープの必要な文字を含んでいる状態。
なので、?で置き換えて処理してもらいたい感じ。
id = [ 2, 4, 5, 8, 9 ]
これをうまくconditionsに当てはめたい。
結果できたスパゲッティーは以下。
if ( id.size != 0 ) then rep_ar = [] # idの件数分'?'を追加 for i in 0..( ( id.size ) -1 ) rep_ar << '?' end User.find( :all, conditions => ["id IN ( #{rep_ar.join( ',' )} )", *id] ).each do |h| p h[:id] end
ミソだったのは*(アスタリスク)!
まさかこんな便利だったとは。
呼び出し側のアスタリスクは配列を展開しますが、受け取り側のアスタリスクは残りの引数を配列化してくれるそうな。
あやうくスパゲッティーを超えて、乾燥しはじめたソウメンになるところでした。