読者です 読者をやめる 読者になる 読者になる

ここにタイトルが入ります

デザイン&プログラミングのことも書くし、それ以外のことも書く。

【Rails】ActiveRecord経由せずにsql直接実行する方法がたくさんあるの知らなかった…

Rails

RailsにはActiveRecordという素晴らしいORマッパーが付属していますが、
パフォーマンスの問題とか複雑な処理とかで
やっぱり直接SQL実行したい…って場面多々ありますよね。

SQL直接実行するコマンドって
「execute」しか知らなかったんです…


で、executeで実行すると
結果が何か「Mysql2::Result」みたいなクラスのオブジェクトで返ってきて
使いづらいんです…
Mysqlの場合)

$ ActiveRecord::Base.connection.execute("select * from users where age > 20")

いちいちeachで値を取って整形したりして…
上記のようなselect文の結果なら、モデル経由で取ってくる時みたいに
配列とかで返してくれれば… とか思ってました。


そしたらやっぱりあった(゚д゚)!


〜参考になりました!〜
ActiveRecord::ConnectionAdapters::DatabaseStatements
なんかいろんなコマンドが用意されている様子…


例えばselect文をselectメソッドを使って実行すると、

$ ActiveRecord::Base.connection.select("select * from users where age > 20")
       #=>結果はこのように [{id: 1, name: hoge, age: 22}, {id: 2, name: fuga, age: 25}]

結果がハッシュの配列になって返ってきます!!
これですよ私が求めていたのは。


ちょっと他のは試してないんですけど、deleteやらinsertやらおなじみの名前が見えますので
いろんなSQLに対応したメソッドが用意されている模様。
(中のソース読んだりパフォーマンスとか計測してないんですが実は遅いとかないですよね…?)


意外とRails(ActiveRecord)使ってても生SQL書きますもんね。
お試しあれ。