はじめに
Railsのアプリを作ってて、複数TBLを結合した結果をGROUP BY
で集計するような、ちょっと複雑な検索処理が必要となり生のSQLを実行したかったので、そのやり方をメモしましたφ(..)
やりかた
SELECT文の場合は、ActiveRecord::Base.connection.select_all
の引数にSQLの文字列を与えてあげればOK(/・ω・)/
返り値をto_hash
してあげれば、[{"column1" => "hoge1","column2" => "hoge2"},{"column1" => "hoge1","column2" => "hoge2"}...]
のような形で扱える。
# SQLを作成 sql = <<-"EOS" SELECT pages.name, pages.url, COUNT(*) FROM pages INNER JOIN favorites ON pages.id = favorites.page_id GROUP BY pages.name, pages.url ORDER BY COUNT(*) DESC EOS # sqlを実行し、取得結果をhashに変換 ActiveRecord::Base.connection.select_all(sql).to_hash
ちなみにUPDATEの場合は、ActiveRecord::Base.connection.execute
を使うらしい。
sql = "UPDATE favorites SET read = true" ActiveRecord::Base.connection.execute(sql)
参考リンク
書いたあとに調べたけど、テーブル同士の結合とかは、ActiveRecordのメソッドを使っても実現出来たかもしれない。。。
おわりに
生のSQLを書くのは、DBを変更(posgresql -> mysql等)の際に不具合の元になったりしそうなので、あまり推奨されないと思いますが、どうしても必要なときもあると思いますので、参考になれば幸いです。